CDI: @Decorator @Stateless - PullRequest
       22

CDI: @Decorator @Stateless

2 голосов
/ 10 января 2012

Может ли CDI Decorator быть ejb без сохранения состояния?

Я пытался:

@Decorator
@Stateless
public class WarehouseHandlingDecorator implements SerialKitServiceWarehouseHandling {


@Inject
@Any
@Delegate
protected SerialKitServiceWarehouseHandling serialKitServiceWarehouseHandling;

...

}

Я развернул на JBoss 6.1 и получил следующее сообщение:

WELD-000038 Невозможно поместить @Delegate в точку внедрения, которой нет в декораторе: бин @New Session [класс com.eggsweb.production.services.WarehouseHandlingDecorator с квалификаторами [@New];локальные интерфейсы: [SerialKitServiceWarehouseHandling]

Ответы [ 2 ]

5 голосов
/ 11 января 2012

Декораторы и перехватчики не могут быть EJB.Вы можете поместить декораторы и перехватчики на в EJB, но EJB не может быть декоратором или перехватчиком.

Вы можете вставить EJB-объекты в декоратор или перехватчик, чтобы открыть некоторые опции,Может быть, добавить боб @Stateless в @Decorator и поручить ему делегировать работу, которую вы представляли для EJB.

Фактически, вы можете передать EJB ссылку на @Delegate в декораторе @PostConstruct, а затем делегировать все вызовы EJB, а не исходному делегату.

0 голосов
/ 11 января 2012

Моя проблема заключается в том, чтобы обернуть в одну транзакцию вызов делегата 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){}
 }
}
...