JavaEE奇怪的实体行为
我有一种奇怪的行为。我正在做一个项目,这是一个使用JavaEE的web应用程序。它使用Eclipselink 2.3持久性服务部署在GlassFish 3.1.1上。一切都在Eclipse、Windows7 professional 64位、JDK+JVM 64位上 我有一个业务对象要处理。首先,我设置了相应的实体。只要调用一个方法,一切都很好。如果我在其中调试,实体会突然变为null 在此调用之前,实体被实例化 代码如下:JavaEE奇怪的实体行为,java,windows,web,ejb,Java,Windows,Web,Ejb,我有一种奇怪的行为。我正在做一个项目,这是一个使用JavaEE的web应用程序。它使用Eclipselink 2.3持久性服务部署在GlassFish 3.1.1上。一切都在Eclipse、Windows7 professional 64位、JDK+JVM 64位上 我有一个业务对象要处理。首先,我设置了相应的实体。只要调用一个方法,一切都很好。如果我在其中调试,实体会突然变为null 在此调用之前,实体被实例化 代码如下: // get my entity tramiteProxy = e
// get my entity
tramiteProxy = ejbTramiteFactory.getEntity(tramite);
// get corresponding business thru factory
IRegistrableInLiquidador registrableInLiquidadorBusiness = (IRegistrableInLiquidador) ejbTramiteFactory.getCBusiness(tramiteProxy);
// invoke business
// up to here everything is fine, you can inspect business variable and it shows correct, entity is instantiated as expected
registrableInLiquidadorBusiness.registrarNovedadInIntegrador();
现在我们在业务对象(registableInLiquidOrBusiness
)内部进行调试:
我必须补充一点,对象实体是在业务之父中声明的一个变量,它从中扩展
所以我不知道还能尝试什么。我查看了与此相关的每一行代码,发现任何错误都是徒劳的
下一步可能是下载Eclipselink源代码并对其进行调试,看看幕后发生了什么,尽管我甚至不知道这是否与此有关
任何建议都将不胜感激。该类可能是一个@Stateless bean,而
registernovedadinintegrader
是该bean上的一个业务方法吗?是的,它是一个@Stateless bean。经过一些研究,我必须假设作为一个无状态bean,因此为一个请求“保留”它的状态,如果一个用户想要设置任何属性,比如我的实体,我应该调用该类上的一个方法,setEntity(实体),在该调用之后,状态丢失,因此在下一次调用中,我的实体为null(EJB引擎将为我提供另一个业务EJB实例,而不是我以前使用的那个实例)。您的分析是正确的;无状态bean的特定方面会导致您的实体为null。
// Here if one checks the entity it became null !!!
public void registrarNovedadInIntegrador() throws CException {
try {
CIntegradorBusiness ejbIntegradorBusiness = CCTX
.getEJB(CIntegradorBusiness.class);
// Here's the problem: getEntity() returns null, the entity of this business object became *magically* null
ejbIntegradorBusiness.registrarNovedad(getEntity(),null);
} catch (Exception e) {
throw new CException(1, e);
}
}