2012-01-10 71 views
2

CDI裝飾器可以是無狀態的ejb嗎?CDI:@Decorator @Stateless

我想:

@Decorator 
@Stateless 
public class WarehouseHandlingDecorator implements SerialKitServiceWarehouseHandling { 


@Inject 
@Any 
@Delegate 
protected SerialKitServiceWarehouseHandling serialKitServiceWarehouseHandling; 

... 

} 

我部署在JBoss 6.1和我得到以下信息:

WELD-000038不能將@Delegate在注射點,這是不是在裝飾:@New會話bean [class com.eggsweb.production.services.WarehouseHandlingDecorator with qualifiers [@New];本地接口是[SerialKitServiceWarehouseHandling]

回答

5

修飾器和攔截器不能是EJB。您可以將裝飾器和攔截器放置在的EJB上,但EJB不能是裝飾器或攔截器。

您可以將EJB注入Decorator或Interceptor,以便打開一些選項。也許可以在@Decorator中注入@Stateless bean,並讓它委託您爲EJB所想象的工作。

實際上,您可以將EJB引用傳遞給裝飾器的@PostConstruct中的@Delegate,然後將所有調用委託給EJB而不是原委託。

0

我的問題是在單個事務來包裝調用委託EJB和調用另一個EJB,假設上述方法是裝飾方法:

protected void method(Object param1, Object param2){ 
//decorated method 
delegate.method(param1,param2); 
//another ejb call 
anotherEJB.doSomething(param1);  
} 

如果我注入的UserTransaction,假設以在Java EE容器中,上述代碼片段是否正確?

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){} 
} 
}