4

ローカルのグラスフィッシュ サーバーで 2 つのアプリケーションを実行しています。1 つは自転車をレンタルするためのもので、もう 1 つは電車の切符を購入するためのものです。列車のアプリケーションからリモート ejb を呼び出して、選択した時間に自転車をレンタルできるようにしたいと考えましたが、その方法がよくわかりません。私はすでにいくつかの異なるアプローチを試しました。両方のアプリケーションは異なるパッケージに含まれており、電車のアプリケーションは自転車のリモート インターフェイスを認識している必要がありますが、それを実現する方法がわかりません。

リモート インターフェイス (自転車アプリ):

@Remote
public interface FahrradRemote {
    public List<Fahrrad> findAvaible(Date start, Date end);
    public void addAuftrag(Fahrrad fahrrad, Date startDate, Date endDate);
    public boolean login(String name, String passwort);
}

呼び出したい自転車 EJB:

@Stateless(name="FahrradService",mappedName="FahrradService")
public class FahrradService implements javax.ejb.SessionBean, FahrradRemote, Serializable {

    @PersistenceContext
    private EntityManager em;
    Kunde customer;
...
}

電車アプリの始まり:

@Named
@SessionScoped
public class BahnPM implements Serializable {

    private String startStation;
    private String zielStation;
    private String loginName;
    private String loginPasswort;
    private String customerName;
    private String startDateString;
    private Date startDate;
    private List<Fahrt> available;
    private List stations;


    @EJB
    private BahnService service;

    @EJB(mappedName="FahrradService")
    private static FahrradRemote fahrradService;

    public BahnPM() {
    }

    ...
}

私が受け取るエラーは、クラスが見つからないという例外です。これは別のアプリケーションであり、私のトレイン アプリは「FahrradRemote」を認識していないため理解できますが、その EJB を挿入するにはどうすればよいですか?

4

3 に答える 3

3

自転車アプリでは、次のことを行う必要があります。

  • @Remoteから注釈を削除しますinterface FahrradRemote
  • @Remote注釈を追加しますFahrradService EJB

このスニペットに従うことができます:

@Remote(FahrradRemote.class)
@Stateless
public class FahrradService implements FahrradRemote, Serializable {
    .... // your code 
}

(EJB 3.X を使用している場合、EJB で SessionBean インターフェースを明示的に実装する必要はありません)

電車アプリで:

@EJB(name="FahrradService") 
private FahrradRemote fahrradService;

( ;nameの代わりに属性を使用mappedNameし、ステートレス EJB で静的プロパティを使用することはできません)

最後に、コンテナーに EJB 実装を検索する場所を指示する必要があります。記述子を作成し、タグglassfish-ejb-jar.xml内に次のように記述します。glassfish-ejb-jar

<enterprise-beans>
  <ejb>
    <ejb-name>BahnPM</ejb-name>
    <ejb-ref>
      <ejb-ref-name>FahrradService</ejb-ref-name>
      <jndi-name>java:global/MyRemoteBeanModule/MyRemoteBean</jndi-name>
    </ejb-ref>
  </ejb>
</enterprise-beans>

リモート EJB の移植可能な JNDI 名 (私は と呼んでいjava:global/MyRemoteBeanModule/MyRemoteBeanます) は、bicycle アプリケーションをデプロイすると、GlassFish ログで使用できます。

于 2012-08-12T22:18:30.560 に答える
0

FahrradService-EJBjar と jarが必要ですFahrradService-client(名前は例であり、2 つの jar があるだけです)。Java EE プラグイン/ツールを使用して EJB を作成した場合、IDE は両方を生成します。

EBJ jar とクライアント jar の両方が、いずれかのアプリケーションと共にパッケージ化されます。アプリケーションをデプロイすると EJB が確立されるため、参照、ルックアップ、注入などを行うことができます。

クライアント jar は、@EJB またはルックアップを介して EJB を使用する他のアプリケーションにパッケージ化されます。

両方のアプリケーションが同じ app-server インスタンスにデプロイされると仮定すると、それは非常に単純なはずです。

于 2012-08-11T21:24:44.647 に答える