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

我有一个弹簧启动项目,它有一个CrudRepository,一个实体和一个控制器。我基本上是在尝试根据传递给控制器的数据来持久化实体。

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

控制器方法:

@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="email_address", 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;
   }
}

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

javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator: class test.UserUniqueValidator`

这似乎是因为它不具有弹簧感知能力,并且无法将依赖项注入构造函数。因此,我想做的是完全禁用Hibernate验证(因为它是冗余的并且已经在控制器中发生)。

似乎有一个名为的属性,您可以将其设置为 。但是,我无法弄清楚在基于代码的配置中设置它的位置。javax.persistence.validation.modenone

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

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

谢谢!


答案 1

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

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

在文件中。application.properties

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


答案 2

@Erin德拉蒙德的答案用于数据库实体验证(单个记录)

但是,如果有人遇到架构验证问题,则属性可以很好地工作。

# Hibernate ddl auto (create, create-drop, validate, update, none)
spring.jpa.hibernate.ddl-auto=none

推荐