【问题标题】:CDI: @Decorator @StatelessCDI:@Decorator @Stateless
【发布时间】:2012-01-10 17:39:49
【问题描述】:
CDI 装饰器可以是无状态的 ejb 吗?
我试过了:
@Decorator
@Stateless
public class WarehouseHandlingDecorator implements SerialKitServiceWarehouseHandling {
@Inject
@Any
@Delegate
protected SerialKitServiceWarehouseHandling serialKitServiceWarehouseHandling;
...
}
我在 JBoss 6.1 上部署并收到以下消息:
WELD-000038 无法将 @Delegate 放置在不在装饰器上的注入点:@New 会话 bean [类 com.eggsweb.production.services.WarehouseHandlingDecorator 带限定符 [@New];本地接口是 [SerialKitServiceWarehouseHandling]
【问题讨论】:
标签:
ejb
decorator
cdi
jboss6.x
【解决方案1】:
装饰器和拦截器不能是 EJB。您可以将装饰器和拦截器放在一个 EJB 上,但一个 EJB 不能是装饰器或拦截器。
您可以将 EJB 注入到装饰器或拦截器中,这样可以打开一些选项。也许将@Stateless bean 注入@Decorator 并让它委托您为EJB 想象的工作。
实际上,您可以将装饰器的@PostConstruct 中的@Delegate 引用传递给EJB,然后将所有调用委托给EJB,而不是原来的委托。
【解决方案2】:
我的问题是将对委托 ejb 的调用和对另一个 ejb 的调用包装在一个事务中,假设上述方法是装饰器方法:
protected void method(Object param1, Object param2){
//decorated method
delegate.method(param1,param2);
//another ejb call
anotherEJB.doSomething(param1);
}
如果我注入UserTransaction,假设在Java EE容器中,上面的sn-p是否正确?
protected void method(Object param1, Object param2){
try{
userTransaction.begin();
delegate.method(param1,param2);
anotherEJB.doSomething(param1);
userTransaction.commit();
}catch(){
try{
userTransaction.rollback();
}catch(Exception e){}
}
}