我有一个弹簧引导项目,它有一个CrudRepository,一个实体和一个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注释.它的验证器如下所示:
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;
}
}
似乎正在发生的事情是,验证正在运行两次.一旦通过@Valid注释在控制器中,并且一旦Hibernate尝试持久化对象.但是,当Hibernate尝试保留对象时,它会抛出:
javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator: class test.UserUniqueValidator`
这似乎是因为它不是弹簧感知,并且不能将依赖注入到构造函数中.所以,我想做的是完全禁用Hibernate验证(作为其冗余并已在控制器中发生).
似乎有一个名为javax.persistence.validation.mode的属性,您可以将其设置为none.但是,我无法为我的生活找出在基于代码的配置中设置它的位置.
我想做的是“后配置”Spring Boot为我创建的持久层所需的部分,因为如果我定义了自己的,那么我不再使用Spring Boot的自动配置.任何人都可以帮我确定是否1)这是可能的和2)哪些部分我需要配置和如何?
谢谢!