当事务回滚时,Spring返回null

时间:2017-12-09 13:51:31

标签: java spring transactions

你能告诉我如何只为某些代码块运行事务?我有@Transactional的服务函数,从中我调用存储库函数执行查询。但是当查询失败时,它也失败了服务功能,因为必须结束事务。那么当存储库函数失败时,我怎么能返回null值?失败时我需要捕获空值,并继续一些逻辑。我的代码:

public class SomeService{

    @Autowired
    SomeRepository repo;

    @Transactional
    public int getSomeValue(){

        MyObj obj = repo.getLastItem(); // this failed because not items in table, so I need here null
        if (obj != null) {
            //some calculations
            return [calculatedValue]
        } else {
            return 1
        }

    }
}

修改 我试过@davidxxx的答案,我收到了这个错误:

  

交易仅标记为回滚;不能承诺;嵌套异常是javax.persistence.PersistenceException:org.hibernate.TransactionException:事务已标记为仅回滚;无法提交

1 个答案:

答案 0 :(得分:0)

您可以在try/catch语句中包含可能引发异常的代码,并指定您不希望对此特定异常进行回滚:

public static final int DEFAULT_VALUE_WHEN_GET_LAST_ITEM_FAILED = 1;
...
@Transactional(rollbackFor = ExpectedException.class)
public int getSomeValue(){

    try {
      MyObj obj = repo.getLastItem(); // this failed because not items in table, so I need here null   
      if (obj != null) {          
          return calculatedValue();
        }                     
    }
    catch(ExpectedException e){  
       //TODO exception logging
    }

    return DEFAULT_VALUE_WHEN_LAST_ITEM_FAILED;

}