6

多数の JAR を含む EAR ファイルがあり、これらの JAR の 1 つにローカル セッション Bean (EJB3) が含まれています。これらのセッション Bean の JNDI ルックアップを、EAR にも含まれている (この場合は EJB と同じ JAR にある) 管理されていない POJO 内から実行する必要があります。Glassfish EJB FAQに従ってみましたが、何を試しても javax.naming.NameNotFoundException を受け取り続けます。

私はいくつかのことについて確信が持てません。ejb-jar.xml はどこに配置すればよいですか (EAR の META-INF と JAR の META-INF を試しました)。sun-ejb-jar.xml は必要ですか? ejb-link とは正確には何ですか? 何が間違っている可能性がありますか (私の構成は、ローカル ルックアップの FAQ に記載されているものとほとんど同じです)。

私が試した構成の一部と結果を以下にリストします。

<enterprise-beans>
  <session>
    <ejb-name>ITestBean</ejb-name>
    <ejb-class>com.test.TestBean</ejb-class>
    <ejb-local-ref>
      <ejb-ref-name>ITestBean</ejb-ref-name>
      <local>com.test.ITestBean</local>
    </ejb-local-ref>
  </session>
 </enterprise-beans>

アプリケーションはデプロイされますが、JNDI ルックアップは null を返します。

<enterprise-beans>
  <session>
    <ejb-name>ITestBean</ejb-name>
    <ejb-class>com.test.TestBean</ejb-class>
    <ejb-local-ref>
      <ejb-ref-name>ITestBean</ejb-ref-name>
      <local>com.test.ITestBean</local>
      <ejb-link>ITestBean</ejb-link>
    </ejb-local-ref>
  </session>
 </enterprise-beans>

アプリケーションがデプロイされない: EJB 3.0 ref のローカル ビジネスとリモート ビジネスの指定を判別できません。未解決の EJB-Ref ITestBean@jndi。

<enterprise-beans>
  <session>
    <ejb-name>ITestBean</ejb-name>
    <ejb-class>com.test.TestBean</ejb-class>
    <ejb-local-ref>
      <ejb-ref-name>ITestBean</ejb-ref-name>
      <local>com.test.ITestBean</local>
      <ejb-link>MyJar.jar#ITestBean</ejb-link>
    </ejb-local-ref>
  </session>
 </enterprise-beans>

アプリケーションがデプロイされません: エラー: 未解決: MyJar.jar#ITestBean。

<enterprise-beans>
  <session>
    <ejb-name>ITestBean</ejb-name>
    <local>com.test.ITestBean</local>
    <ejb-local-ref>
      <ejb-ref-name>ITestBean</ejb-ref-name>
    </ejb-local-ref>
  </session>
 </enterprise-beans>

EjbDescriptor の処理中にエラーが発生しました

4

5 に答える 5

9

System.out またはログに、InitialContext 内のすべての名前をいつでもダンプすることもできます。

//Get all the names in the initial context
NamingEnumeration children = initialContext.list("");

while(children.hasMore()) {
    NameClassPair ncPair = (NameClassPair)children.next();
    System.out.print(ncPair.getName() + " (type ");
    System.out.println(ncPair.getClassName() + ")");
  }
}
于 2009-10-07T10:22:22.813 に答える
2

ejbファイルのejb-jar.xmlは、(耳ではなく、EJB-Jarの)META-INFに入ります。デプロイメント記述子のEJB参照は次のようになります。

<ejb-local-ref>
    <ejb-ref-name>EJBName</ejb-ref-name>
    <ejb-ref-type>Session</ejb-ref-type>
    <local>classname</local>
    <ejb-link>JARName.jar#EJBName</ejb-link>
</ejb-local-ref>

ルックアップコードは次のようになります。

Context c = new InitialContext();
return (EJBLocalInterface) c.lookup("java:comp/env/EJBName");

このタイプのルックアップには、コンテナー固有のデプロイメント記述子(sun-ejb-jar.xml)が必要になるとは思いません。

于 2009-10-06T13:57:02.457 に答える
2

EJB 3 Portability Issueのブログ記事が参考になると思います。

于 2009-10-06T14:45:53.580 に答える
0

POJO がマネージド クラス (セッション Bean など) から (直接的または間接的に) 呼び出されない限り、POJO から Bean の JNDI ルックアップを実行することはできません。つまり、最初の例は機能しませんが、2 番目の例は機能します (MyPOJO が JNDI ルックアップを実行しようとするクラスであると仮定します)。

1) UnmanagedClass1 -> UnmanagedClass2 -> UnmanagedClass3 -> MyPOJO
2) ManagedClass -> UnmanagedClass2 -> UnmanagedClass3 -> MyPOJO

于 2009-11-02T11:50:13.850 に答える
0

私はglassfish v2に取り組んでおり、EJB3からJSNIを呼び出すときは、sun-ejb-jar.xmlではなくejb-jar.xmlのみが必要です

<ejb-jar xmlns = "http://java.sun.com/xml/ns/javaee" 
     version = "3.0" 
     xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">

         <enterprise-beans>

             <session>
                 <ejb-name>TestBean1</ejb-name>
                 <ejb-local-ref>
                    <ejb-ref-name>ejb/TestLocal</ejb-ref-name>
                    <ejb-ref-type>Session</ejb-ref-type>
                    <local>com.clients.TestLocal</local>
                    <mapped-name>ejb/TestLocal</mapped-name>
                </ejb-local-ref>
                 <ejb-local-ref>
                    <ejb-ref-name>ejb/Test2Local</ejb-ref-name>
                    <ejb-ref-type>Session</ejb-ref-type>
                    <local>com.clients.Test2Local</local>
                    <mapped-name>ejb/Test2Local</mapped-name>
                </ejb-local-ref>
              <session>
        <enterprise-beans>

@Stateless(mappedName="ejb/TestLocal")
public class TestBean1 implements TestLocal

@Stateless(mappedName="ejb/Test2Local")
public class TestBean2 implements Test2Local

TestBean1 内のサービス ロケーターを次のように呼び出します。

ic.lookup("java:comp/env/ejb/Test2Local");

Test2Bean を返します

于 2010-06-26T01:52:41.453 に答える