0

シンプルなJEEアプリケーションを開発し、@ localインターフェイスの実装を選択するためにtryngしています。 私は、インターフェイス階層を持っています:ParentLocalChildALocalChildBLocalと対応する実装:ChildABean,ChildBBean。注釈を使用してChildALocal/ChildBLocalの実装ParentLocalを選択できます。 ejb-jar.xmlを使って同じことをするにはどうすればいいですか?
ParentLocal.java親インターフェイスでEJBを挿入する方法は?

@Local 
public interface ParentLocal { 
    public String getName(); 
} 

ChildALocal.java

@Local 
public interface ChildALocal extends ParentLocal { 
} 

ChildBLocal.java

@Local 
public interface ChildBLocal extends ParentLocal { 
} 

ChildABean.java

@Stateless 
public class ChildABean implements ChildALocal { 
    @Override 
    public String getName() { 
     return "ChildA"; 
    } 
} 

ChildBBean.java

@Stateless 
public class ChildBBean implements ChildBLocal { 
    @Override 
    public String getName() { 
     return "ChildB"; 
    } 
} 

ManagerBean.java

@Stateless 
public class ManagerBean implements ManagerLocal { 
    /**works fine, servlet prints "ChildA", so I would like to get the same result using DD 
    @EJB(beanInterface = my.package.model.ChildALocal.class) 
    ParentLocal annotatedChildBean;*/ 

    /**doesn`t work!*/ 
    @EJB 
    ParentLocal childBeanUsingDeploymentDesrciptor; 

    //.... 
} 

リソース/ META-INF/EJB-jar.xmlの

<?xml version="1.0" encoding="UTF-8"?> 
<ejb-jar> 
    <description>IBM WAS test application </description> 
    <display-name>Test Manager</display-name> 
    <enterprise-beans> 
     <session> 
      <ejb-local-ref> 
       <ejb-ref-name>my.package.manager.ManagerBean/childBeanUsingDeploymentDesrciptor</ejb-ref-name> 
       <local>my.package.model.ParentLocal</local> 
       //doesn`t work 
       <!--<local>my.package.model.ChildBLocal</local>--> 
       //doesn`t work 
       <ejb-link>ChildBBean</ejb-link> 
      </ejb-local-ref> 
     </session> 
    </enterprise-beans> 
</ejb-jar> 

リソース/ META-INF/IBM-EJB-JAR-bnd.xml WebServletで

<?xml version="1.0" encoding="UTF-8"?> 
<ejb-jar-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee/ibm-ejb-jar-bnd_1_0.xsd" version="1.0"> 
    <session name="ManagerBean"> 
     //doesn`t work 
     <ejb-ref name="my.package.manager.ManagerBean/childBeanUsingDeploymentDesrciptor" binding-name="ejb/session/ChildBBean"/> 
    </session> 
</ejb-jar-bnd> 

私はManagerBeanを注入し、MainServlet
インナーBean名を印刷するにはそれ `sメソッドを呼び出します。 java

私のすべての子の実装は、私が耳に入れた別々のモジュールです。私は、サーブレットを起動しようとすると IBM WebSpehere 8.5.5は私に次のエラーが表示されます。

Error 500: javax.ejb.EJBException: The EJB reference in the war-main-servlet.war module of 
the earManager application could not be resolved; nested exception is: 
com.ibm.ejs.container.EJBNotFoundException: EJB with interface my.package.model.ChildBLocal 
not present in application earManager. 

UPD

属性 beanInterfaceでejb-jar.xmlで重複しない方法
Error 500: javax.ejb.EJBException: The EJB reference in the war-main-servlet.war module of 
    the earManager application could not be resolved; nested exception is: 
    com.ibm.ejs.container.EJBNotFoundException: EJB with interface my.package.model.ParentLocal 
    not present in application earManager. 

または(および)ibm-ejb-jar-bnd.xml?

答えて

0

beanInterfaceのDD当量<local>(又は<remote>)でありbeanNameの等価は<ejb-link>あります。

この例の問題は、ejb-jar.xml<session>要素に特定のEJBを結びつけるものがないことが原因です。XML要素は、EJB名が一致したときにアノテーションのオーバーライドと見なされます。代わりに<local>のあなたは<ejb-link>ChildBBean</ejb-link>を使用することができ、

<enterprise-beans> 
    <session> 
     <ejb-name>ManagerBean</ejb-name> 
     <ejb-local-ref> 
      <ejb-ref-name>my.package.manager.ManagerBean/childBeanUsingDeploymentDesrciptor</ejb-ref-name> 
       <local>my.package.model.ChildBLocal</local> 
      </ejb-local-ref> 
     </session> 

<ejb-name> 

または:@Statelessは名前が含まれていないので、デフォルトではManagerBeanになりますので、XMLを含める必要があります。

すべてのBeanは同じアプリケーション内にあるため、ibm-ejb-jar-bnd.xmlファイルは必要ありません。ただし、バインディングファイルを使用する場合は、ここで指定した構文が正しいと思われるので、binding-nameの値が正しくない可能性があります。 ChildBBeanが同じ場所にバインドされるように別のibm-ejb-jar-bnd.xmlファイルが必要です。

+0

エラーを修正しました。私は、ParentLocalの代わりにChildBLocalインターフェイスを指摘しました。何も変わっていない。とにかく、私は、IBM-EJB-JAR-bnd.xml取り出して、今、私のejb-jar.xmlのは、次のとおりです。 '' <エンタープライズビーン> ManagerBean my.package.manager.ManagerBean/childBeanUsingDeploymentDesrciptor my.package.model.ChildBLocal my.package.children.ChildBBean '' エラーがまだあります –

+0

' 'が正しくない場合は、クラスではなくEJB名にする必要があります。同じエラーを ''および/または ''の – Tracy

+0

は、私はどちらかそれを試してみました、ありがとう 'ですBeanはサーブレットと同じEARにあります。このようにパッケージされていない可能性はありますか?また、Beanが起動していることを確認する必要があります。ログに次のようなメッセージがあるはずです。 CNTR0167I:サーバーがChildBBean Enterprise BeanのChildBLocalインターフェイスをxyxアプリケーションのabc.jarモジュールにバインドしています。バインディングの場所は次のとおりです。java:global/xyz/abc/ChildBBean!ChildBLocal –

関連する問題