一个似乎多次被问过的问题 - 但可能不那么简单,目前的答案似乎都不适合我。
我有一个非常简单的基于Web的Spring-boot应用程序和一个REST控制器:
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseStatus(HttpStatus.OK)
public void delete(@PathVariable("id") String id) {
boolean success = customerService.delete(id);
if (!success) {
throw new ResourceNotFoundException();
}
}
我有一个带有删除方法的服务,该方法标记为Transactional:
@Override
@Transactional
public boolean delete(String id) {
try {
customerRepository.delete(id);
} catch (EmptyResultDataAccessException e) {
return false;
}
return true;
}
我正在捕获异常,因为如果删除是针对不存在的实体,我不希望我的服务实现在删除上抛出异常。从JpaRepository派生的customerRepository id是为我自动生成的。
如果我尝试删除现有实体 - 一切都很好。如果我尝试删除一个不存在的实体,则抛出并捕获EmptyResultDataAccessException,返回值false,然后当方法结束并提交事务时,我得到javax.persistence.RollbackException: Transaction marked as rollbackOnly
。
我理解(或者认为我做过)发生的事情我只是不确定如何停止它。我已经尝试将noRollbackFor的各种组合添加到我的Transaction注释中,但无济于事。