JEE:无法将 <bean> 字段 <service>.<bean> 设置为 <bean>$Proxy$
JEE: Can not set <bean> field <service>.<bean> to <bean>$Proxy$
我对 JEE 世界还比较陌生,所以请多多包涵。
我无法理解本地 wildfly(版本 10.1.0)服务器抛出的异常。
异常状态:
Can not set <package>.beans.ApplicationBean field <package>.service.rest.ApplicationService.applicationBean to <package>.beans.ApplicationBean$Proxy$_$$_Weld$EnterpriseProxy$
应用服务器上的实际部署成功,但调用 REST 调用会产生上述异常。
奇怪的部分是:如果我第二次部署同一个包,调用的 REST 调用不会生成异常并且应用程序按预期工作。
类 有问题的是:
<包>.beans.ApplicationBean
@Stateless
@LocalBean
public class ApplicationBean {
@Inject
private ApplicationDao applicationDao;
... some methods ...
}
<包>.service.rest.ApplicationService
@Path("/applications")
@Stateless
@LocalBean
public class ApplicationService {
@Inject
private ApplicationBean applicationBean;
... methods which use the applicationBean field ...
}
我在 CDI/EJB 方面使用注解的原因是:
@Stateless
因为我需要在我的 DAO class 中进行交易(为了完整起见,下面列出了 DAO class)
@LocalBean
因为我试图注入特定的实现 classes 而没有接口
<包>.daos.ApplicationDao
@Stateless
@LocalBean
public class ApplicationDao {
@PersistenceContext
private EntityManager em;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
... method ...
}
我不确定这是否与它有任何关系,但 ApplicationService class 位于与 bean 和 dao 不同的模块中。最后,它们一起形成一个 ear 文件,其中共享模块(bean 和 daos)是 ejbModule,服务是 web 应用程序。
非常感谢一些见解 - 干杯!
这可能是一些事情,但这是我最好的猜测:
尝试将您的@Inject 更改为@EJB
@Stateless
@LocalBean
public class ApplicationBean {
@EJB
private ApplicationDao applicationDao;
... some methods ...
}
<包>.service.rest.ApplicationService
@Path("/applications")
@Stateless
@LocalBean
public class ApplicationService {
@EJB
private ApplicationBean applicationBean;
... methods which use the applicationBean field ...
}
如果这解决了问题,那么问题很可能是包含 class 的 jar 文件没有 beans.xml 文件,因此它没有被 CDI 拾取。
我对 JEE 世界还比较陌生,所以请多多包涵。
我无法理解本地 wildfly(版本 10.1.0)服务器抛出的异常。
异常状态:
Can not set <package>.beans.ApplicationBean field <package>.service.rest.ApplicationService.applicationBean to <package>.beans.ApplicationBean$Proxy$_$$_Weld$EnterpriseProxy$
应用服务器上的实际部署成功,但调用 REST 调用会产生上述异常。
奇怪的部分是:如果我第二次部署同一个包,调用的 REST 调用不会生成异常并且应用程序按预期工作。
类 有问题的是:
<包>.beans.ApplicationBean
@Stateless
@LocalBean
public class ApplicationBean {
@Inject
private ApplicationDao applicationDao;
... some methods ...
}
<包>.service.rest.ApplicationService
@Path("/applications")
@Stateless
@LocalBean
public class ApplicationService {
@Inject
private ApplicationBean applicationBean;
... methods which use the applicationBean field ...
}
我在 CDI/EJB 方面使用注解的原因是:
@Stateless
因为我需要在我的 DAO class 中进行交易(为了完整起见,下面列出了 DAO class)@LocalBean
因为我试图注入特定的实现 classes 而没有接口
<包>.daos.ApplicationDao
@Stateless
@LocalBean
public class ApplicationDao {
@PersistenceContext
private EntityManager em;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
... method ...
}
我不确定这是否与它有任何关系,但 ApplicationService class 位于与 bean 和 dao 不同的模块中。最后,它们一起形成一个 ear 文件,其中共享模块(bean 和 daos)是 ejbModule,服务是 web 应用程序。
非常感谢一些见解 - 干杯!
这可能是一些事情,但这是我最好的猜测:
尝试将您的@Inject 更改为@EJB
@Stateless
@LocalBean
public class ApplicationBean {
@EJB
private ApplicationDao applicationDao;
... some methods ...
}
<包>.service.rest.ApplicationService
@Path("/applications")
@Stateless
@LocalBean
public class ApplicationService {
@EJB
private ApplicationBean applicationBean;
... methods which use the applicationBean field ...
}
如果这解决了问题,那么问题很可能是包含 class 的 jar 文件没有 beans.xml 文件,因此它没有被 CDI 拾取。