我有以下代码:
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public Car prepareCar(Data data) throws CarServiceException{
Car car = null;
try {
car = carManagerBean.createCar(data);
Driver driver = createDriver();
car.setDriver(driver);
} catch (Exception e) {
LOGGER.error(e.getMessage, e);
context.setRollbackOnly();
throw new CarServiceException(e);
}
return car;
}问题是,如果在尝试部分(例如SQLServerException)中出现一些问题,则不会执行catch部分,也不会抛出CarServiceException。有人知道这段代码可能出了什么问题吗?但无论如何,事务都会被回滚。只有当我移动try-catch块来包装方法调用时,它才能工作。
发布于 2016-07-29 21:05:15
您希望捕获事务外部的异常。执行以下操作:
@Stateless
public class CarServiceDelegate {
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public Car prepareCar(Data data) throws CarServiceException{
Car car = carManagerBean.createCar(data);
Driver driver = createDriver();
car.setDriver(driver);
return car;
}
}
public class CarService {
@EJB
private CarServiceDelegate carServiceDelegate;
public Car prepareCar(Data data) {
try {
return carServiceDelegate.prepareCar();
} catch (Exception e) {
// You will catch it here, when the transaction is done.
LOGGER.error(e.getMessage, e);
throw new CarServiceException(e);
}
}
}我将更新EJb异常的哪一部分要求在事务外部传播异常。在@Asynchronous调用中也会发生类似的行为(异常被抑制)。
发布于 2016-07-29 20:14:18
请记住,如果catch块本身抛出异常,它将不会到达重新抛出异常的段。请注意,根据文档,如果事务不再处于活动状态,setRollbackOnly()可能会抛出IllegalStateException。您可能希望将catch块包装在另一个try/catch块中以发现这一点。
https://stackoverflow.com/questions/38658462
复制相似问题