2

私は EJB3 を初めて使用し、2 つが同じサーバー (WAS 8) 上の別々の ear ファイルにある場合、JSF マネージド Bean からリモート ejb を呼び出すのに問題があります。それらが同じearファイルにある場合、問題はありません。しかし、同じサーバー上の異なるアプリケーション間で機能する呼び出しが必要です。

マネージド Bean への EJB インジェクション中に、次の例外が発生します。

Caused by: javax.ejb.EJBException: The EJB/BelgianBeerSessionBean EJB reference in the null component in the BeerStoreWebProject.war module of the BeerStoreWebEAR application could not be resolved; nested exception is: com.ibm.ejs.container.EJBNotFoundException: EJB with interface com.ejb.view.BelgianBeerSessionBeanRemote not present in application BeerStoreWebEAR
Caused by: com.ibm.ejs.container.EJBNotFoundException: EJB with interface com.ejb.view.BelgianBeerSessionBeanRemote not present in application BeerStoreWebEAR
    at com.ibm.ejs.container.HomeOfHomes.getHomeByInterface(HomeOfHomes.java:928)
    at com.ibm.ws.ejbcontainer.injection.factory.EJBLinkObjectFactory.getObjectInstance(EJBLinkObjectFactory.java:261)
    at com.ibm.ws.ejbcontainer.injection.factory.EJBLinkObjectFactory.getObjectInstance(EJBLinkObjectFactory.java:167)

この問題の真相を突き止め、リモート EJB が別の EAR ファイルにある場合に、リモート EJB をどのように注入してルックアップするべきかを説明してくれる人がいるといいのですが。

これが私のセットアップです:

プロジェクトのセットアップ

1) BelgianBeersEJMProjectClient (インターフェースを含む ejb クライアント プロジェクト)

package com.ejb.view;
public interface BelgianBeerSessionInterface {
    List<Country> getAllCountries();
    void saveCountries(List<Country> countries);
}

package com.ejb.view;
@Remote
public interface BelgianBeerSessionBeanRemote extends
        BelgianBeerSessionInterface {

}

2) BelgianBeersEJBProject (ejb 実装を含む)

    package com.ejb;
    @Stateless
    public class BelgianBeerSessionBean implements BelgianBeerSessionBeanRemote,
            BelgianBeerSessionBeanLocal {

        public BelgianBeerSessionBean() {
            // TODO Auto-generated constructor stub
        }

        public List<Country> getAllCountries() {
                //to be implemented
                return null;
        }
        public void saveCountries(List<Country> countries) {
            //to be implemented
        }
    }

また、META-INF には ejb-jar.xml があります。

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar version="3.1" xmlns="http://java.sun.com/xml/ns/javaee" 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_1.xsd">
  <display-name>BelgianBeersEJBProject </display-name>
  <ejb-client-jar>BelgianBeersEJBProjectClient.jar</ejb-client-jar> 
 </ejb-jar>

3) BelgianBeersWebProject - jsf アプリが含まれています

@ManagedBean
@ViewScoped
public class BeerStorePageBean {

    @EJB(name="EJB/BelgianBeerSessionBean")
    private BelgianBeerSessionBeanRemote store;
    public BelgianBeerSessionBeanRemote getStore() {
        return store;
    }
    public void setStore(BelgianBeerSessionBeanRemote store) {
        this.store = store;
    }
    private List<Country> countries = null;

    @PostConstruct
    public void populateCountries(){
        System.out.println("Store = " + store);
        countries = store.getAllCountries();    
    }
    public List<Country> getAllCountries() {

        return countries;
    }
}

web.xml には ejb エントリがあります。

<ejb-ref>
        <description />
        <ejb-ref-name>EJB/BelgianBeerSessionBean</ejb-ref-name>
        <ejb-ref-type>Session</ejb-ref-type>
        <home />
        <remote>com.ejb.view.BelgianBeerSessionBeanRemote</remote>
    </ejb-ref>

配備ユニット

EAR file 1 (BelgianBeersEARProject.ear) contains:
   1) BelgianBeersEJBProject.jar
   2) BelgianBeersEJBProjectClient.jar

 EAR file 2 (BeerStoreWebEAR.ear) contains: 
   1. BeerStoreWebProject.war
   2. BelginaBeersEJBProjectClient.jar

別の EAR ファイルにあるリモート EJB を呼び出す正しい方法を誰か説明してください。助けてください!髪をかきむしる!

4

1 に答える 1

1

@EJBアノテーション (および XML で対応する)<ejb-ref>は、ターゲット EJB が同じアプリケーション内にある場合にのみ自動的にリンクします。javadoc から:

明示的なリンク情報が提供されず、同じアプリケーション内に一致するクライアント ビュー タイプを公開するセッション Bean が 1 つしかない場合、デフォルトでは、EJB 依存関係はそのセッション Bean に解決されます。

別のアプリケーションの EJB にリンクするには、バインディングを指定する必要があります。これはいくつかの方法で行うことができます。

  1. ejb-jar.xml の に指定<lookup-name>targetBindingName</lookup-name>します。<ejb-ref>
  2. ejb-ref を含む WAR モジュールのファイルで指定<ejb-ref name="EJB/BelgianBeerSessionBean" binding-name="targetBindingName"/>します。バインディング ファイルの形式の詳細については、 InfoCenterWEB-INF/ibm-web-bnd.xmlを参照してください。
  3. アプリケーションのデプロイ時にターゲット バインディング名を指定します (つまり、「既定のバインディングを使用しないでください」)。

いずれにせよ、ターゲット EJB のバインディング名が必要になります。上記の InfoCenter リンクには、「従来の」WebSphere Application Server バインディング名と Java EE 6 標準の「java:global」名の両方が記載されています。前者は で構成できibm-ejb-jar-bnd.xml、後者は構成できませんが (alternate<application-name>またはを指定する以外は<module-name>)、どちらを使用しても問題ありません。CNTR0167I使用されている名前を見つけるには、EJB アプリケーションを開始し、開始時に EJB コンテナーによって出力されるメッセージを探すのが最も簡単です(最初のメッセージは「クラシック」バインディングです)。

[6/6/13 17:26:04:531 CDT] 00000049 WASNameSpaceB I   CNTR0167I: The server is binding the javax.management.j2ee.ManagementHome interface of the Management enterprise bean in the mejb.jar module of the ManagementEJB application.  The binding location is: ejb/mgmt/MEJB
[6/6/13 17:26:04:544 CDT] 00000049 AbstractEJBRu I   CNTR0167I: The server is binding the javax.management.j2ee.ManagementHome interface of the Management enterprise bean in the mejb.jar module of the ManagementEJB application.  The binding location is: java:global/ManagementEJB/mejb/Management!javax.management.j2ee.ManagementHome
于 2013-06-06T22:31:02.220 に答える