gpt4 book ai didi

java - 如何在保存和抛出检查异常之前进行验证

转载 作者:行者123 更新时间:2023-11-30 12:04:21 24 4
gpt4 key购买 nike

我有以下场景:

  • 有一个用户存储库可以保存/更新用户
  • 我想在保存/更新之前验证用户的名字/姓氏(执行一些字符串操作)
  • 如果执行操作后用户的名字/姓氏小于 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com