我有以下场景:
- 有一个用户存储库可以保存/更新用户
- 我想在保存/更新之前验证用户的名字/姓氏(执行一些字符串操作)
- 如果执行操作后用户的名字/姓氏小于 2 个字符,则应抛出已检查的自定义
UnacceptableStringValueException
请注意,许多服务访问用户存储库,因此在保存之前直接实现新逻辑很麻烦。
为了在保存/更新之前执行验证而不必为每个保存/更新调用显式实现此验证,我尝试做的是使用 JPA 监听器。使用 @PrePersist
和 @PreUpdate
我实现了在每次保存/更新之前执行验证的目标。
但是,此解决方案存在两个问题:
- 已检查的异常不会在保存/更新用户的方法上强制执行,异常会通过监听器自动包装为
RuntimeException
- 当尝试使用 AOP 捕获上述
RuntimeException
并解压缩原始检查异常时,我不断收到org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as仅回滚
请注意,在保存/更新用户之前执行检查的简单服务层不会解决我的用例,因为有一个用户角色存储库也可以保存/更新用户 (@ManyToOne(optional = false,级联 = CascadeType.PERSIST)
)
解决上面场景中描述的约束的好方法是什么?
最佳答案
我通过修复 org.springframework.transaction.UnexpectedRollbackException: Transaction silently rollback because it has been marked as rollback-only
错误找到了一个可行的解决方案。
问题是,已检查异常导致意外回滚,为了解决这个问题,我将自定义已检查异常添加到可以像这样回滚的异常中:@Transactional(rollbackFor = {UnacceptableStringValueException.类})
关于java - 如何在保存和抛出检查异常之前进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57182993/