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

标签 java hibernate spring-boot jpa

我有以下场景:

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

相关文章:

java - 非法尝试将代理与两个打开的 session 相关联

spring-boot - 更新rabbitmq中消息的有效负载

Java:查看小程序是否显示在屏幕上

java - 用 Java 解析 XML

java - 为什么session.save(object)在hibernate中不自动设置id?

spring-boot - SpringBoot 无法增强 @Configuration bean 定义 'beanNamePlaceholderRegistryPostProcessor'

java - 独立 REST 服务的 Spring Boot 安全性

java - bean类[org.springframework.transaction.interceptor.TransactionInterceptor]的无效属性 'transactionManagerBeanName'

java - 如何在java中的quartz调度中传递数组作为参数

spring - 嵌套异常是 org.springframework.dao.InvalidDataAccessResourceUsageException - 无法执行查询(Spring 和 Hibernate)