Java 如何通过远程接口代理访问有状态会话bean?

Java 如何通过远程接口代理访问有状态会话bean?,java,ejb,ejb-3.0,openejb,Java,Ejb,Ejb 3.0,Openejb,我有一个testcase,它使用的是@LocalClient注释(嵌入式容器),并使用@EJB注释注入EJB: @LocalClient public class MyTestCase { @EJB private BoxDao boxDao; ... } BoxDao是一个远程EJB接口。现在,为了进行测试,我需要访问BoxDao的实现BoxDaoBean的一些内部状态,这是一个有状态会话bean。我在BoxDaoBean中创建了一个受保护

我有一个testcase,它使用的是@LocalClient注释(嵌入式容器),并使用@EJB注释注入EJB:

@LocalClient
public class MyTestCase {

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

在测试用例中,有没有办法访问远程接口BoxDao后面的有状态会话bean?不管解决方案是否具体


更新:不幸的是,我们不能使用EJB3.1特定的解决方案,因为我们有几个EJB3.0项目正在运行。使用Proxy.getInvocationHandler(boxDao),我可以通过StatefleJBObjectHandler访问OpenEjb容器。可以通过这种方式访问有状态bean吗?

您可以尝试让
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;

    ...   

}

您可以尝试让
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名称才能使其工作。我们在项目中不能做的事情:(请参阅该博客文章中的任何内容都不是最新的。在Java EE 6中,我们采用了OpenEJB的嵌入式EJB容器概念,并将其作为
javax.EJB.embedded.EJBContainer
API合并到EJB3.1规范中。然后,我们使用新的
Java:global
Java:app
名称空间对EJB JNDI名称进行了标准化幸运的是,测试用例注入没有进入EJB3.1标准。OpenEJB仍然通过
EJBContainer.createEJBContainer(p.getContext().bind(“注入”,this)
)支持它。感谢David的更新,我将把它带到团队中。作为替代方案,(例如,对于我们的EJB3.0项目),您认为有办法通过代理获取有状态bean实例吗?我通过调用proxy.getInvocationHandler(boxDao)看到了这一点,我可以通过StatefleJBObjectHandler访问OpenEjb容器。从那里开始,应该可以访问inctance,对吧?这不会获得实例。最接近的是容器,但实例本身隐藏在容器中。您可以使用该支持为r测试目的。David,非常感谢你的提示。替代描述符非常有效!我尝试过这个方法,但至少对于GlassFish,你必须使用特定于供应商的JNDI名称才能工作。这是我们在项目中无法做到的:(请参阅该博客文章中的任何内容都不是最新的。在Java EE 6中,我们采用了OpenEJB的嵌入式EJB容器概念,并将其作为
javax.EJB.embedded.EJBContainer
API合并到EJB3.1规范中。然后,我们使用新的
Java:global
Java:app
名称空间对EJB JNDI名称进行了标准化幸运的是,测试用例注入没有进入EJB3.1标准。OpenEJB仍然通过
EJBContainer.createEJBContainer(p.getContext().bind(“注入”,this)
)支持它。感谢David的更新,我将把它带到团队中。作为替代方案,(例如,对于我们的EJB3.0项目),您认为有办法通过代理获取有状态bean实例吗?我通过调用proxy.getInvocationHandler(boxDao)看到了这一点,我可以通过StatefleJBObjectHandler访问OpenEjb容器。从那里开始,应该可以访问inctance,对吧?这不会获得实例。最接近的是容器,但实例本身隐藏在容器中。您可以使用该支持为r测试目的。大卫,非常感谢你的提示。替代描述符工作起来很有魅力!