2012-04-11 4 views
4

私はOpenEJB(TomEE ++)を使ってEJB 3プロジェクトに取り組んでいます。どのInitialContextFactoryを使用しますか?

私は、名前がアノテーションで指定されたステートレスセッションBeanを持っています。

@Stateless(mappedName="SlideService", name="SlideService") 
public class SlideService { 

    public Map<Category, List<SlideShow>> fetchSlideShowsByCategory() { 
     Application app = Application.getInstance(); 
     return app.retreiveAllSlideShowsByCategory(); 
    } 

    public SlideShow fetchSlideShow(long id) { 
     return null; 
    } 

    public List<SlideShow> fetchSlideShowsByTitle(String title) { 
     return null; 
    } 

} 

私は、このようなStrutsアクションクラスからセッションBeanを参照します。もし上記のコードで

Properties properties = new Properties(); 
properties.setProperty Context.INITIAL_CONTEXT_FACTORY,"org.apache.openejb.client.LocalInitialContextFactory"); 
InitialContext initialContext = new InitialContext(properties); 
SlideService slideService = (SlideService)initialContext.lookup("SlideServiceLocalBean"); 

は私が明示的にBeanの注釈に「SlideService」を指定しているのに対し、Beanを見つけるために、名「SlideServiceLocalBean」を使用する必要があることに気づくでしょう。

しかし、テストケースでBeanの位置を確認しようとすると、別の名前文字列を使用する必要があります。

EJBContainer ejbContainer = EJBContainer.createEJBContainer(); 
Object oSlideService = ejbContainer.getContext().lookup("java:global/slides/SlideService"); 

なぜルックアップ名に相違がありますか?

Strutsアクションクラスで正しい方法でInitialContextを取得していますか、または別のメカニズム/ contextFactoryを使用して初期コンテキストを取得する必要がありますか?

外部DIライブラリを使用せずに、アクションクラスにBeanを注入することはできますか?

答えて

2

あなたのStrutsアクションクラス内にこれを試してみてください:

new InitialContext().lookup("java:global/slides/SlideService"); 

それは正常に動作する必要があります。だから、アクションクラスの内部からこれをすべきである:

new InitialContext().lookup("java:module/SlideService"); 

これらjava:globaljava:module名前から来LocalInitialContextFactoryが先行したJavaEE 6グローバルJNDIを使用して検索。

このドキュメントでは、この仕組みについて説明します。

Beanの名前がSlideServiceで、@LocalBeanビュー(シングルBeanは、このような@LocalBean、@Remote、@Localとして多くのビューを持つことができます)と呼ばれるものを持っているので、の名前@LocalBeanとしてSlideServiceを検索するとSlideServiceLocalBean

これはちょうどデフォルトフォーマットです。 conf/system.propertiesファイルで好きなものに変更することができます。

+0

私は最初のオプションを試してみてはどうでしょうか?パス[/スライド]のコンテキストでサーブレット[アクション]の例外 "SEVERE:Servlet.service()が例外をスローしました[javax.naming.NameNotFoundException:Nameスライドがこのコンテキストにバインドされていません] javax.naming.NameNotFoundException:名前のスライドがこのコンテキストにバインドされていません。 " – Parag

+0

2番目のオプションが正常に機能しました。 – Parag

関連する問題