【问题标题】:How to access stateful session bean through remote interface proxy?如何通过远程接口代理访问有状态会话 bean?
【发布时间】:2012-08-23 03:11:51
【问题描述】:

我有一个使用OpenEjb 的@LocalClient 注释(嵌入式容器)并使用@EJB 注释注入EJB 的测试用例:

@LocalClient
public class MyTestCase {

    @EJB
    private BoxDao boxDao;
    
    ...   
    
}

BoxDao 是一个远程 EJB 接口。现在,为了测试,我需要访问 BoxDao 的实现 BoxDaoBean 的一些内部状态,它是一个有状态会话 bean。我在 BoxDaoBean 中创建了一个受保护的方法,它公开了所需的内部状态,但在我的测试用例中我还没有找到访问它的方法,因为注入的 BoxDao 是一个远程接口代理(不能转换为 BoxDaoBean)。

有没有办法在测试用例中访问远程接口BoxDao后面的有状态会话bean?解决方案是否针对 OpenEjb 无关紧要。

更新:很遗憾,我们不能使用 EJB 3.1 特定的解决方案,因为我们有几个 EJB 3.0 项目正在运行。使用 Proxy.getInvocationHandler(boxDao),我可以通过 StatefulEjbObjectHandler 访问 OpenEjb 容器。是否可以通过这种方式访问​​有状态 bean?

【问题讨论】:

    标签: java ejb ejb-3.0 openejb


    【解决方案1】:

    您可以尝试让BoxDaoBean 也公开@LocalBean 接口。单个 EJB 可以公开来自 @WebService@Local@Remote、JAX-RS 等的几乎无限数量的视图。

    像这样更新你的bean:

    @Stateful
    @LocalBean
    public class BoxDaoBean implements BoxDao {
       //...
    }
    

    然后在您的测试中添加另一个字段:

    @LocalClient
    public class MyTestCase {
    
        @EJB
        private BoxDao boxDao;
    
        @EJB
        private BoxDaoBean boxDaoBean;
    
        ...   
    
    }
    

    【讨论】:

    • 我试过这个,但至少对于 GlassFish,您必须使用供应商特定的 JNDI 名称才能使其工作。在我们的项目中我们不能做的事情。 :( 见here
    • 那篇博文中没有任何内容是最新的。在 Java EE 6 中,我们采用了 OpenEJB 的嵌入式 EJB Container 概念,并将其作为 javax.ejb.embedded.EJBContainer API 并入 EJB 3.1 规范。然后,我们使用新的java:globaljava:app 命名空间标准化了EJB JNDI 名称。这是example test case that does lookup。不幸的是,测试用例注入并没有进入 EJB 3.1 标准。 OpenEJB 仍然通过EJBContainer.createEJBContainer(p).getContext().bind("inject", this) 支持它。
    • 感谢大卫的更新,我会把这个带给团队。作为替代方案(例如,对于我们的 EJB 3.0 项目),您认为有一种方法可以通过代理获取有状态 bean 实例吗?我看到通过调用 Proxy.getInvocationHandler(boxDao),我可以通过 StatefulEjbObjectHandler 访问 OpenEjb 容器。从那里开始,应该可以通关吧?
    • 这不会让您获得实例。最接近的是容器,但实例本身隐藏在容器内。您也许可以使用 alt-dd 支持添加一个额外的本地接口用于测试目的。
    • 大卫,非常感谢您的提示。备用描述符就像一个魅力!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    相关资源
    最近更新 更多