Como desativar a validação do Hibernate em um projeto Spring Boot
Eu tenho um projeto de inicialização que possui um CrudRepository, uma Entidade e um Controlador. Estou basicamente tentando persistir uma entidade com base nos dados passados para o Controller.
Para fazer isso, estou usandospring-boot-starter-jpa
. Minha entidade é anotada com anotações JSR-303, que são verificadas no controladorantes os dados são passados para o CrudRepository para persistência.
Método do controlador:
@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);
}
Entidade:
@Entity /* JPA */
public class User {
@Id /* JPA */
@Column(name="email_address", nullable=false, length=255) /* JPA */
@UserUnique
private String emailAddress;
}
A causa dos meus problemas é aUserUnique
anotação. Seu validador é assim:
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;
}
}
O que parece estar acontecendo é que a validação está sendo executada duas vezes. Uma vez no controlador via@Valid
anotação e uma vez quando o Hibernate tenta persistir o objeto. No entanto, quando o Hibernate tenta manter o objeto, ele lança:
javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator: class test.UserUniqueValidator`
Isso parece ser porque não tem conhecimento da mola e não pode injetar a dependência no construtor. Então, o que eu quero fazer é desativar completamente a validação do Hibernate (como redundante e já acontecendo no controlador).
Parece haver uma propriedade chamadajavax.persistence.validation.mode
que você pode definirnone
. No entanto, durante toda a minha vida, não consigo descobrir onde defini-lo em uma configuração baseada em código.
Eu percebo que existem perguntas comoInjeção de dependência JSR-303 e Hibernate mas todos eles estão usando a configuração xml e configurando manualmente partes da camada de persistência.
O que eu quero fazer é "pós-configurar" as partes necessárias da camada de persistência que o Spring Boot cria para mim, porque se eu definir o meu próprio, não utilizarei mais a configuração automática do Spring Boot. Alguém pode me ajudar a determinar se 1) isso é possível e 2) quais partes eu preciso configurar e como?
Obrigado!