我想知道EJB规范是否允许通过查找的有状态会话Bean访问有状态会话Bean。
我问的原因是,Jboss EAP 7.0没问题,但是当我尝试访问Bean时,Websphere抛出NullPointerException。
例如:
@Stateful
public class SampleServiceRoot implements SampleServiceRootRemote {
@EJB
protected SampleServiceChildLocal servicechild;
@Override
public SampleServiceChildLocal getServiceChild(){
return servicechild;
}
}
@Stateful
public class SampleServiceChild implements SampleServiceChildLocal,SampleServiceChildRemote{
@Override
public void anyMethod(){
//DO Anything
}
}
当我对SampleServiceRootRemote进行远程查找并调用“ getServiceChild()”并尝试在其上调用“ anyMethod()”时,它可以在JBoss EAP 7.0上运行,但在Websphere上会收到NullPointerException。
所以我想知道这是Websphere中的Bug还是EJB规范禁止使用,而我很幸运使用JBoss EAP 7.0?
答案 0 :(得分:0)
EJB规范确实需要此方案才能工作,具体取决于某些配置选项;例如,有些配置选项可能会禁用它。
您看到NullPointerException的事实表明WebSphere不了解@EJB
类中字段上的SampleServiceRoot
批注。根据EJB规范,如果无法解析SampleServiceRoot
注释,则无法创建@EJB
的实例。由于已创建SampleServiceRoot
的实例,因此可能发生以下情况之一:
1-应用程序执行了new SampleServiceRoot
而不是在JNDI中查找它。这听起来不像是您的问题,但请仔细检查。
2-应用程序包含一个ejb-jar.xml
,其设置为metadata-complete="true"
。设置此选项后,WebSphere将不会查找注释,因此不会看到或处理@EJB
注释。将设置更改为“ false”,或将<ejb-ref>
或<ejb-local-ref>
添加到ejb-jar.xml
文件中。
3-应用程序没有metadata-complete="true"
,但是,当将应用程序部署到WebSphere时,选择了设置元数据完成的选项。
此选项会将完成元数据的设置更改为“ true”。停止使用此选项,或将<ejb-ref>
或<ejb-local-ref>
添加到ejb-jar.xml
文件中。
4-EJB包含在2.4或更早版本的WAR模块中。在WebSphere中,不处理较旧模块的注释。
5-应用程序包含javax.ejb.EJB
类的副本。 WebSphere提供了javax.ejb.EJB
类,它是由WebSphere运行时类加载器加载的。如果应用程序还在应用程序类路径上包含javax.ejb.EJB
类,则应用程序类加载器将加载另一个实例,并且该实例将与EJB容器使用的实例不匹配。如果发生这种情况,则日志中应该有一个警告。
是的,您的情况需要得到支持;但是规范确实允许禁用它的配置。您只需要确定哪个配置/打包选项导致WebSphere无法看到@EJB
注释。
答案 1 :(得分:0)
感谢您的回答,
我们试图将本地接口的声明移至SampleServiceChild的远程接口。同样,我们没有使用@EJB注释。我们通过在InitialContext上查找SampleServiceChild来对其进行管理。 现在可以了