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

Eri*_*ond 29 java hibernate jpa bean-validation spring-boot

我有一个spring boot项目,它有一个CrudRepository,一个Entity和一个Controller.我基本上试图根据传递给Controller的数据来持久化实体.

要做到这一点,我正在使用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);
}
Run Code Online (Sandbox Code Playgroud)

实体:

@Entity /* JPA */
public class User {

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

}
Run Code Online (Sandbox Code Playgroud)

我的问题的原因是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;
   }
}
Run Code Online (Sandbox Code Playgroud)

似乎正在发生的事情是,验证运行两次.一旦在控制器中通过@Valid注释,一旦Hibernate试图持久化对象.但是,当Hibernate尝试持久化对象时,它会抛出:

javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator: class test.UserUniqueValidator`
Run Code Online (Sandbox Code Playgroud)

这似乎是因为它不是Spring知道的,并且无法将依赖注入构造函数中.所以,我想要做的是完全禁用Hibernate验证(因为它是冗余的并且已经在控制器中发生).

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

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

我想要做的是"后配置"Spring Boot为我创建的持久层所需的部分,因为如果我定义自己的部分,那么我不再利用Spring Boot的自动配置.任何人都可以帮我确定1)这是否可行以及2)我需要配置哪些部分以及如何配置?

谢谢!

Eri*_*ond 29

作为[M. Deinum]在我原帖的评论中提到,解决方案是设置:

spring.jpa.properties.javax.persistence.validation.mode=none
Run Code Online (Sandbox Code Playgroud)

application.properties文件中.

此外,此处描述了此行为(很容易错过,因为没有提供示例).

  • 这在 Spring Boot 2.3.5.RELEASE 中对我不起作用 (3认同)