通过查询的有状态会话Bean访问注入的有状态会话Bean

时间:2018-11-20 08:40:44

标签: java ejb websphere jboss-eap-7 stateful

我想知道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?

2 个答案:

答案 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来对其进行管理。 现在可以了