4

OpenEJB(TomEE ++)を使用してEJB3プロジェクトに取り組んでいます。

名前がアノテーションで指定されたステートレスセッション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アクションクラスからSessionBeanを検索します。

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を注入することは可能ですか?

4

1 に答える 1

2

ストラットアクションクラス内でこれを試してください。

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

正常に動作するはずです。したがって、これはアクションクラス内から行う必要があります。

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

これらと名前の由来LocalInitialContextFactoryであるJavaEE6GlobalJNDIより前の日付を使用したルックアップ。java:globaljava:module

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

Beanの名前は、ビューSlideServiceと呼ばれるものであり、@LocalBeanビューと呼ばれます(1つのBeanは、@ LocalBean、@ Remote、@ Localなどの多くのビューを持つことができます)。したがって、SlideServiceを検索するための名前は最終的には次のようになり@LocalBeanます。SlideServiceLocalBean

これはデフォルトの形式です。ファイル内で好きなように変更できconf/system.propertiesます。

于 2012-04-13T07:15:52.620 に答える