【问题标题】:Access an injected Stateful Session Bean over a looked up Stateful Session Bean通过查找的 Stateful Session Bean 访问注入的 Stateful Session Bean
【发布时间】:2019-04-22 16:01:14
【问题描述】:

我想知道 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 中的错误还是 EJB 规范禁止它,而我只是幸运地使用了 JBoss EAP 7.0?

【问题讨论】:

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


    【解决方案1】:

    EJB 规范确实需要这个场景才能工作,这取决于一些配置选项;有一些配置选项可能会禁用它。

    您看到 NullPointerException 的事实表明 WebSphere 不知道 SampleServiceRoot 类中的字段上的 @EJB 注释。根据 EJB 规范,如果无法解析 @EJB 注释,则无法创建 SampleServiceRoot 的实例。由于已创建 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 包含在 WAR 模块中,级别为 2.4 或更早。在 WebSphere 中,不处理旧模块的注释。

    5 - 应用程序包含javax.ejb.EJB 类的副本。 WebSphere 提供了javax.ejb.EJB 类,它由WebSphere 运行时类加载器加载。如果应用程序在应用程序类路径上还包含javax.ejb.EJB 类,则应用程序类加载器将加载另一个实例,它不会匹配 EJB 容器使用的实例。如果发生这种情况,日志中应该会有警告。

    所以是的,您的场景需要得到支持;但是该规范确实允许禁用它的配置。您只需要确定是哪个配置/打包选项导致 WebSphere 看不到 @EJB 注释。

    【讨论】:

      【解决方案2】:

      谢谢你的回答,

      我们尝试将 Local-Interface 的声明移动到 SampleServiceChild 的 Remote Interface。我们也没有使用@EJB 注释。我们通过在 InitialContext 上查找 SampleServiceChild 来管理它。 现在可以了

      【讨论】:

        猜你喜欢
        • 2018-09-16
        • 2011-12-28
        • 1970-01-01
        • 2014-11-20
        • 2012-07-07
        • 1970-01-01
        • 2013-06-19
        • 2015-11-16
        • 2014-01-04
        相关资源
        最近更新 更多