如何在Spring Boot项目中禁用Hibernate验证
我有一个包含CrudRepository,实体和控制器的Spring Boot项目。我基本上是在尝试根据传递给控制器的数据来保留实体。
为此,我正在使用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="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;
}
}
似乎正在发生的事情是,验证运行了两次。一次在控制器中通过@Valid
注释,一次在Hibernate尝试持久化对象时。但是,当Hibernate尝试保留该对象时,它将引发:
javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator: class test.UserUniqueValidator`
这似乎是因为它不具备弹簧意识,无法将依赖项注入到构造函数中。因此,我想做的是完全禁用Hibernate验证(因为它是冗余的,并且已经在控制器中发生)。
似乎有一个javax.persistence.validation.mode
可以设置为的属性none
。但是,我终生无法找出在基于代码的配置中将其设置在何处。
我意识到存在诸如JSR-303依赖项注入和Hibernate之类的问题,但这些问题都使用xml config并手动配置了持久层的各个部分。
我想要做的是“配置” Spring Boot为我创建的持久层的必需部分,因为如果定义自己的持久层,那么我将不再利用Spring
Boot的自动配置。谁能帮助我确定1)是否可行,2)我需要配置哪些部分以及如何配置?
谢谢!
回答:
如[M. [Deinum]在我的原始帖子的评论中提到,解决方案是设置:
spring.jpa.properties.javax.persistence.validation.mode=none
在application.properties
文件中。
此外,此处描述了这种行为(由于未提供示例,因此很容易遗漏)。
以上是 如何在Spring Boot项目中禁用Hibernate验证 的全部内容, 来源链接: utcz.com/qa/422430.html