【发布时间】: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 注入?
谢谢
【问题讨论】:
-
你在混合概念。
@Decoratorcomes 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