我有以下代码:
@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;
}
问题是如果在try部分中出现一些问题(例如SQLServerException),则不执行catch部分并且不抛出CarServiceException。有人知道这段代码可能有什么问题吗?但无论如何,交易都会回滚。 它只有在我移动try-catch块来包装方法调用时才有效。
答案 0 :(得分:1)
您希望捕获事务之外的异常。这样做:
@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异常的哪一部分要求在事务外传播Exception的更新。在@Asynchronous
调用中会发生类似的行为(抑制异常)。
答案 1 :(得分:0)
请记住,如果catch块本身抛出异常,它将不会到达重新抛出异常的段。请注意,根据文档,如果事务不再处于活动状态,setRollbackOnly()
可以抛出IllegalStateException
。您可能希望将catch
块包装在另一个try/catch
块中以发现它。