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 为空(没有装饰器,一切正常)。我想是因为装饰器使用@Inject 而不是@EJB 注释(@EJB 注释不能在@Decorator 中使用),而EntityManager 没有被注入。

但是,我该怎么做才能让 entitymanager 使用@decorator 注入?

谢谢

4

1 回答 1

0

尝试在 META-INF 中添加一个空 beans.xml,这将激活 CDI bean 发现。我的项目也有类似的问题。

在此处查看 oracle 文档:http: //docs.oracle.com/javaee/6/tutorial/doc/gjbnz.html

您必须创建一个空 beans.xml 文件以向 GlassFish Server 表明您的应用程序是 CDI 应用程序。这个文件在某些​​情况下可以有内容,但在像这样的简单应用程序中却没有。

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

祝你好运 !

亚历山大·基里洛夫

于 2015-05-08T07:36:33.867 回答