jboss - transactionrequiredexception - either use a transaction or extended persistence context
Transacciones CMT (1)
Una pregunta más de mi parte ... Si tengo un servicio sin estado (Stateless Session Bean) como fachada (digamos GlobalService) qué métodos invocan varios otros servicios (nuevamente SLSBs, digamos FooService y BarService):
@Stateless
@Remote(GlobalService.class)
@TransactionManagement(TransactionManagementType.CONTAINER)
public class GlobalServiceBean implements GlobalService{
private Logger log = Logger.getLogger(GlobalServiceBean.class);
@EJB
private FooService fooService;
@EJB
private BarService barService;
public void createFoo(Foo foo, Bar bar) throws WrappedGoneBadException{
fooService.create(foo); // bang here
barService.create(bar); // no bang here
Todos los métodos en FooService (así como BarService, que se ve más o menos igual) anotaron que requieren una nueva transacción:
@Stateless
@Remote(FooService.class)
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class FooServiceBean implements FooService{
public Foo save(Foo foo){
... // exception here
Presunto FooServiceBean persiste algunos objetos de tipo ''Foo'' y durante este, se lanzará una excepción no comprobada (DuplicateKeyException) ¿Esto afecta a la transacción ''circundante'' que se revertirá o se ignorará y se creará la barra?
Mi pensamiento inicial fue que no afectará la transacción, pero Jboss me demostró que estaba equivocado ...
¿Es este el comportamiento que uno puede esperar, me equivoco y, en caso afirmativo ... cómo aislarlos a ambos: Foo para causar una excepción y, obviamente, no se salvó, pero Bar se guardará?
Lástima de mí ... fue el manejo de excepciones inapropiado lo que hace que el cliente detenga el mundo antes de continuar con la segunda transacción.