如何在Spring Boot项目中禁用Hibernatevalidation
我有一个spring boot项目,它有一个CrudRepository,一个Entity和一个Controller。 我基本上试图根据传递给Controller的数据来持久化实体。
为此,我使用的是spring-boot-starter-jpa
。 我的实体使用JSR-303注释进行注释, 在将数据传递给CrudRepository以进行持久化之前 ,在控制器中对其进行检查。
控制器方法:
@RequestMapping(value = "users", method = { RequestMethod.POST }) public SuccessfulResponse addUser(@Valid @RequestBody User user, BindingResult validation) { if (validation.hasErrors()) { throw new ValidationException(validation); } User saved = this.users.save(user); return new SuccessfulResponse(saved); }
实体:
@Entity /* JPA */ public class User { @Id /* JPA */ @Column(name="email_address", nullable=false, length=255) /* JPA */ @UserUnique private String emailAddress; }
我的问题的原因是UserUnique
注释。 它的validation器如下所示:
public class UserUniqueValidator implements ConstraintValidator { 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; } }
似乎正在发生的是,validation正在运行两次。 一旦通过@Valid
注释进入控制器,一旦Hibernate试图持久化该对象。 但是,当Hibernate尝试持久化对象时,它会抛出:
javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator: class test.UserUniqueValidator`
这似乎是因为它不是Spring知道的,并且不能将dependency injection构造函数中。 所以,我想要做的是完全禁用Hibernatevalidation(因为它是冗余的并且已经在控制器中发生)。
似乎有一个名为javax.persistence.validation.mode
的属性,您可以将其设置为none
。 但是,我不能为我的生活找出在基于代码的配置中设置它的位置。
我意识到有一些问题,比如JSR-303dependency injection和Hibernate,但这些都是使用xml配置并手动配置持久层的部分。
我想要做的是“后配置”Spring Boot为我创建的持久层所需的部分,因为如果我自己定义,那么我不再利用Spring Boot的自动配置。 任何人都可以帮我确定1)这是否可行以及2)我需要配置哪些部分以及如何配置?
谢谢!
作为[M. Deinum]在我原帖的评论中提到,解决方案是设置:
spring.jpa.properties.javax.persistence.validation.mode=none
在application.properties
文件中。
此外, 此处描述了此行为(很容易错过,因为没有提供示例)。
- 由于@Constraint validatedBy,如何避免层之间的交叉依赖?
- 使javaxvalidation错误消息更具体
- 如何使用@DecimalMin和@DecimalMaxvalidationList ?
- JSF / Hibernate NotBlankvalidation
- Jersey / JAX-RS资源方法输入beanvalidation
- 有没有办法从Bean Validation字段级ConstraintValidator中访问目标bean?
- hibernate唯一密钥validation
- Hibernate Validator方法或构造函数validation
- 如何在JBoss 6.4中禁用javax.validation.api