Java EE 7 – @Decorator,@ Stateless和@PersistenceContext = nullpointerException
我在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注入实体管理器吗?
谢谢
尝试在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
祝你好运 !
亚历山大基里洛夫
- 如何以静态方法以编程方式将Java CDI托管bean注入局部变量
- 什么是CDI的实例或Guices Provider的Spring等价物
- 是否可以在Java SE环境中使用javax.interceptor?
- 何时应该使用Instance 和Provider 在CDI中注入bean?
- Java CDI @PersistenceContext和线程安全
- Weld / CDI最好的调试技巧是什么?
- 一场战争中有多个CDI配置文件(开发,测试版,qa,生产)?
- 由于公共私人领域的矛盾,使用Junit @Rule的CdiUnit测试是不可能的
- Field.get(obj)返回注入的CDI托管bean上的所有空值,而手动调用getter则返回正确的值