【问题标题】: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){}
       }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-30
        • 2023-01-26
        • 1970-01-01
        • 1970-01-01
        • 2015-04-25
        • 2013-12-31
        相关资源
        最近更新 更多