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

标签 java hibernate jpa spring-boot bean-validation

我有一个 Spring Boot 项目,它有一个 CrudRepository、一个实体和一个 Controller 。我基本上是在尝试根据传递给 Controller ​​的数据来持久化一个实体。

为此,我使用 spring-boot-starter-jpa。我的实体使用 JSR-303 注释进行注释,这些注释在 Controller 中进行检查数据被传递到 CrudRepository 以进行持久性。

Controller 方法:

@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 注释。它的 validator 如下所示:

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 注释进入 Controller ,一次是当 Hibernate 尝试持久化对象时。但是,当 Hibernate 尝试持久化对象时,它会抛出:

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

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

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

我知道有些问题像 JSR-303 dependency injection and Hibernate但这些都是使用 xml 配置和手动配置持久层的一部分。

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

谢谢!

最佳答案

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

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

application.properties 文件中。

此外,此行为是 described here (很容易错过,因为没有提供示例)。

关于java - 如何在 Spring Boot 项目中禁用 Hibernate 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26764532/

相关文章:

Java:Web 应用程序中的 hibernate - 无法实例化默认 tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]

java - 在两个实体中映射相同的列表并使用 Spring Data 更新列表

java - Eclipse IDE 显示 JPA 中复合主键类的错误

java - 如何获取 JPA 自定义查询的结果作为页面

java - 在 jaxrs 中获取 javax.xml.bind.UnmarshalException

java - 在 Linux 命令行上从 JAR 执行 Java 类

java - 依赖注入(inject) Spring

hibernate - 如何控制 Hibernate 的日志记录?

java - 无法使用 Hibernate Search 搜索子实体

Java:根据行首从文件中读取行