Java 如何通过远程接口代理访问有状态会话bean?
我有一个testcase,它使用的是@LocalClient注释(嵌入式容器),并使用@EJB注释注入EJB: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中创建了一个受保护
@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测试目的。大卫,非常感谢你的提示。替代描述符工作起来很有魅力!