我的项目中有以下代码。第 4 行抛出异常,但我的产品详细信息仍被保存。我很难理解为什么即使在抛出异常之后它仍然保存产品详细信息 我还想了解第 4 行抛出的异常是已检查异常还是未检查异常?如果我抛出“抛出新异常(“详细信息不匹配”)”,我假设这是一个运行时异常?
class Product{
@Transactional
addDetails(){
try{
}
catch (Exception e) {
throw new Exception("Details dont match") //Line 4
}
productDAO.save(productDetails)
addAdditionalDetails(productDetails)
}
}
class ProductDAO {
@Transactional
public void save(Product productDetails){
entitiyManager.merge(productDetails)
}
}
我也想了解第 4 行抛出的异常是否是 检查或非检查异常?
答案:
java.lang.Exception
是受检查异常。
如果我抛出“抛出新异常(“详细信息不匹配”)”,那么它是 我假设运行时异常?
答案:不,这不是
RuntimeException
。 RuntimeException 是那些扩展了 java.lang.RuntimeException
或其 subclass
。
在spring中,当发生
Runtime
异常时,Transaction是Rollback。这意味着事务中抛出的任何异常都会被 extends RuntimeException
或其子类回滚。但就你而言,你抛出的 Exception
不是 RuntimeException
的一种。
解决方案:
我建议创建一个自定义异常,它扩展
RuntimeExction
并抛出它。
class UnmatchedDetailException extends RuntimeException{
UnmatchedDetailException(String msg){
super(msg);
}
}
然后扔
UnmatchedDetailException
throw new UnmatchedDetailException("Deatils not matched");
使用默认的 spring 配置,仅回滚未经检查的运行时异常。为了自定义此配置,rollbackFor用作@Transactional注释中的属性。
对于前任,
@Transactional(rollbackFor = { MyInvalidUserException.class, MyApplicationException.class }) public void method() 抛出 MyInvalidUserException,MyApplicationException { ... ... }