4

Java ee 7 (glassfish 4) でデコレータ パターンを使用しています。

私はこのデコレータを持っています

@Decorator
public class FooIndexer implements FooService {

    @Inject
    @Delegate
    FooService fooService;

    private Logger logger = Logger.getLogger(FooIndexer.class.getName());

    //@Inject
    //Indexer indexer;

    @Override
    public Foo create(Foo foo, boolean index) {

        fooService.create(foo, index);

        if (index) {
            System.out.println("Im in");
        }

        return foo;
    }

}

そして、この EJB クラス

@Stateless(name = "fooService")
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
@DeclareRoles({"ADMINISTRATOR", "USER"})
public class FooServiceImpl implements FooService {

    @PersistenceContext(unitName = "foo")
    private EntityManager em;

    @Resource(lookup="java:comp/EJBContext")
    private SessionContext ctx;

    /** CRUD **/
    @RolesAllowed("ADMINISTRATOR")
    public Foo create(Foo foo, boolean index) {

        Principal cp = ctx.getCallerPrincipal();

        System.out.println(cp.getName());

        em.persist(foo);

        return foo;
    }
}

このデコレーター パターンを使用すると、EJB の EntityManager が null になります (デコレーターがないと、すべてうまくいきます)。デコレーターが @EJB アノテーションの代わりに @Inject を使用しているためであり (@EJB アノテーションは @Decorator では使用できません)、EntityManager が注入されていないためだと思います。

しかし、@decorator を使用して entitymanager が注入されるようにするにはどうすればよいですか?

ありがとうございました

4

1 に答える 1

0

META-INF に空の beans.xml を追加してみてください。これにより、CDI Bean の検出がアクティブになります。私のプロジェクトでも同様の問題がありました。

ここでオラクルのドキュメントを参照してください:http://docs.oracle.com/javaee/6/tutorial/doc/gjbnz.html

アプリケーションが CDI アプリケーションであることを GlassFish Server に示すために、空の beans.xml ファイルを作成する必要があります。このファイルは、状況によってはコンテンツを持つことができますが、このような単純なアプリケーションではそうではありません。

http://docs.oracle.com/javaee/6/tutorial/doc/gjbju.html#gjcvh

幸運を !

アレクサンダー・キリロフ

于 2015-05-08T07:36:33.867 に答える