【问题标题】:Java EE 7 - @Decorator, @Stateless and @PersistenceContext = nullpointerExceptionJava EE 7 - @Decorator、@Stateless 和 @PersistenceContext = nullpointerException
【发布时间】:2013-06-20 15:08:13
【问题描述】:

我在 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 注入?

谢谢

【问题讨论】:

  • 你在混合概念。 @Decorator comes from CDI managed beans@EJB 用于 EJB 注入。
  • 所以,Luiggi Mendoza,重复我的建议。我该怎么做才能使用@decorator 和这段代码注入实体管理器?
  • @LuiggiMendoza 根据 CDI 1.1 规范,EJB 也是托管 bean。请参阅 CDI 1.1 规范的 3.1.1. Which Java classes are managed beans? 部分。
  • 是的,但 CDI 和 EJB bean 由不同的管理器处理。

标签: java jakarta-ee ejb decorator cdi


【解决方案1】:

尝试在您的 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

祝你好运!

亚历山大·基里洛夫

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 2011-06-10
    • 2013-06-30
    相关资源
    最近更新 更多