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

Xav*_*jas 2 java session ear ejb glassfish-3

如何在另一个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
Run Code Online (Sandbox Code Playgroud)

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");
Run Code Online (Sandbox Code Playgroud)

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

TestSessionLocal_1389930137
Run Code Online (Sandbox Code Playgroud)

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

请帮忙.

先感谢您.

Bre*_*ail 7

根据EJB 3.1规范的3.2.2:

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

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

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