从另一个EAR访问本地会话Bean?

如何在另一个EAR中调用EAR中的本地会话Bean,这两个EAR都部署在同一个Glassfish v3域中?

这是结构:

Glassfish v3 Domain1 EAR1 EAR1-EJB.jar class TestSessionBean <-- @Stateless common.jar interface TestSessionLocal <-- @Local EAR2 EAR2-EJB.jar class TestSessionBeanClient <-- @Singleton, @LocalBean common.jar interface TestSessionLocal <-- @Local 

TestSessionBean实现了TestSessionLocal,两个EAR都有common.jar。

我需要使用TestSessionBeanClient中的TestSessionBean。 我想利用本地会话bean因为性能。

我知道我不能在TestSessionBeanClient中使用简单的@EJB调用,所以我尝试像这样查找:

 InitialContext ic = new InitialContext(); TestSessionLocal tsl = ic.lookup("java:global/EAR1/EAR1-EJB/TestSessionBean!org.test.TestSessionLocal"); 

这将抛出ClassCastException,因为返回的对象不是TestSessionLocal,而是代理类,如:

 TestSessionLocal_1389930137 

为了能够调用它的方法,我必须做反思才能找到它的方法。

请帮忙。

先谢谢你。

根据EJB 3.1规范的3.2.2:

只有在与提供本地客户端视图的企业bean相同的应用程序中打包的本地客户端才需要通过本地客户端视图访问企业bean。 此规范的兼容实现可以选择支持从打包在不同应用程序中的本地客户端访问企业bean的本地客户端视图。 应用程序间访问本地客户端视图的配置要求是特定于供应商的,不在本规范的范围内。 依赖于对本地客户端视图的应用程序间访问的应用程序是不可移植的。

这是GlassFish FAQ: 我有一个带有Local接口的EJB组件。 我可以从其他应用程序中的Web组件访问它吗?

(也就是说,您可以尝试打包您的界面,使其由两个应用程序共有的ClassLoader加载。)

你真的不想这样做。 如另一个答案所述,它不需要得到支持。 它存在问题的众多原因之一是因为它可能导致类加载器问题。 如果你在一只耳朵中有类引用另一只耳朵中的类,那么就会发生各种不好的事情(例如,如果另一只耳朵被重新部署,那么跨类加载器引用会变得无效)。

这是我在Stackoverflow上发布的第一条消息,但我承认我经常阅读它。 顺便说一句,提前抱歉我的英语。

我想我找到了另一个解决这个问题的方法:

我用@Remote注释了我的EJB,这是我的sun-ejb配置。

太阳ejb-jar.xml中

   XXX   required required supported required   supported    

经过一些测试后,似乎没有已知证书的客户端无法访问EJB。 其他EAR可以在没有任何身份validation的情况下访问此EJB。

编辑:我尝试了ClassLoader解决方案,但它对我的项目不可行