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

时间:2011-04-15 19:03:08

标签: java session ejb glassfish-3 ear

如何从另一个EAR中调用EAR内的本地会话Bean 部署在同一个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

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

请帮忙。

提前谢谢。

3 个答案:

答案 0 :(得分:7)

EJB 3.1规范的每3.2.2:

  

通过访问企业bean   只需要本地客户端视图   为本地客户提供支持   打包在同一个应用程序中   作为提供的企业bean   本地客户端视图。合规   本规范的实现   可以选择支持访问   企业的本地客户端视图   来自本地客户端的bean打包在   不同的应用。该   配置要求   应用程序间访问本地   客户端视图是特定于供应商的   超出了这个范围   规格。依赖的应用程序   应用程序间访问本地   客户端视图是不可移植的。

以下是GlassFish常见问题解答:I have an EJB component with a Local interface. Can I access it from a web component in a different application?

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

答案 1 :(得分:4)

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

答案 2 :(得分:0)

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

我想我找到了解决这个问题的替代方案:

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

<强>太阳ejb-jar.xml中

  <ejb>
    <ejb-name>XXX</ejb-name>

    <ior-security-config>
        <transport-config>
            <integrity>required</integrity> 
            <confidentiality>required</confidentiality>
            <establish-trust-in-target>supported</establish-trust-in-target>
            <establish-trust-in-client>required</establish-trust-in-client>
        </transport-config>

        <sas-context>
            <caller-propagation>supported</caller-propagation>
        </sas-context>
    </ior-security-config>
  </ejb>

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

编辑:我尝试过ClassLoader解决方案,但这对我的项目来说不可行