Java EE 7 - @Decorator,@ Stateless和@PersistenceContext = nullpointerException

时间:2013-06-20 15:08:13

标签: java java-ee ejb decorator cdi

我在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(没有装饰器,一切都很顺利)。我是因为装饰器使用@Inject而不是@EJB注释(@EJB注释不能在@Decorator中使用),并且没有注入EntityManager。

但是,我可以使用@decorator注入实体管理器吗?

谢谢

1 个答案:

答案 0 :(得分:0)

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

请在此处查看oracle doc: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

祝你好运!

Alexander Kirilov