52ky 发表于 2022-5-3 11:14:59

如何在 Spring Boot 项目中禁用 Hibernate 验证

问题
我有一个 Spring Boot 项目,它有一个 CrudRepository、一个实体和一个控制器。我基本上是根据传递给控制器??的数据来持久化一个实体。

为此,我使用 spring-boot-starter-jpa 。我的实体使用 JSR-303 注释进行注释,这些注释在数据传递到 CrudRepository 以进行持久性之前在控制器中签入。

控制器方法:
@RequestMapping(value = "users", method = { RequestMethod.POST })
public SuccessfulResponse<User> addUser(@Valid @RequestBody User user, BindingResult validation) {
    if (validation.hasErrors()) {
      throw new ValidationException(validation);
    }
    User saved = this.users.save(user);
    return new SuccessfulResponse<User>(saved);
}
实体:
@Entity /* JPA */
public class User {

   @Id /* JPA */
   @Column(name=&quot;email_address&quot;, nullable=false, length=255) /* JPA */
   @UserUnique
   private String emailAddress;

}
我的问题的原因是 UserUnique 注释。它的验证器如下所示:
public class UserUniqueValidator implements ConstraintValidator<UserUnique, String> {

   private UserRepository users;

   @Autowired
   public UserUniqueValidator(UserRepository users) {
       this.users = users;
   }

   @Override
   public void initialize(UserUnique annotation) {}

   @Override
   public boolean isValid(String value, ConstraintValidatorContext context) {
       return users.findOne(value) == null;
   }
}
似乎正在发生的是验证运行了两次。通过 @Valid 注释进入控制器,当 Hibernate 尝试持久化对象时。但是,当 Hibernate 尝试持久化对象时,它会抛出:

javax.validation.ValidationException:HV000064:无法实例化ConstraintValidator:类test.UserUniqueValidator`

这似乎是因为它不支持spring,并且无法将依赖项注入构造函数。所以,我所做的是完全禁用 Hibernate 验证(因为它是多余的并且已经在控制器中发生)。

似乎有一个名为 javax.persistence.validation.mode 的属性可以设置为 none 。但是,在我的一生中,我找不到在基于代码的配置中设置它的位置。

我意识到有一些问题,比如 JSR-303 依赖注入和 Hibernate,但这些都是使用 xml 配置和手动配置持久层的一部分。

我想要做的是“后配置”。 Spring Boot 为我创建的持久层的必需部分,因为如果我定义自己的部分,那么我将不再利用 springboot 的自动配置。谁能帮我确定1)这是可能的,2)我需要配置哪些部分以及如何配置?

谢谢!

回答
正如我在原始文章评论中提到的,解决方案是设置:

spring.jpa.properties.javax.persistence.validation.mode=none

在 application.properties 文件中。

此外,此处描述了此行为(由于未提供示例,因此很容易忽略此行为)。



页: [1]
查看完整版本: 如何在 Spring Boot 项目中禁用 Hibernate 验证