mkyong example application java hibernate jpa spring-boot bean-validation

example - spring java hibernate



Cómo deshabilitar la validación de Hibernate en un proyecto Spring Boot (1)

Tengo un proyecto de arranque de primavera que tiene un CrudRepository, una entidad y un controlador. Básicamente estoy tratando de persistir una entidad basada en los datos pasados ​​al Controlador.

Para hacer esto, estoy usando spring-boot-starter-jpa . Mi entidad está anotada con las anotaciones JSR-303, que se verifican en el controlador antes de que los datos se transfieran a CrudRepository para su persistencia.

Método del 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); }

Entidad:

@Entity /* JPA */ public class User { @Id /* JPA */ @Column(name="email_address", nullable=false, length=255) /* JPA */ @UserUnique private String emailAddress; }

La causa de mis problemas es la anotación de UserUnique . Su validador se ve así:

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; } }

Lo que parece estar sucediendo es que la validación se ejecuta dos veces. Una vez en el controlador a través de la anotación @Valid , y una vez cuando Hibernate intenta persistir el objeto. Sin embargo, cuando Hibernate intenta persistir el objeto, lanza:

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

Esto parece ser porque no es sensible a los resortes y no puede inyectar la dependencia en el constructor. Entonces, lo que quiero hacer es deshabilitar la validación de Hibernate completamente (ya que es redundante y ya está sucediendo en el controlador).

Parece que hay una propiedad llamada javax.persistence.validation.mode que puede establecer en none . Sin embargo, no puedo, por el resto de mi vida, averiguar dónde establecerlo en una configuración basada en código.

Me doy cuenta de que hay preguntas como la inyección de dependencias JSR-303 y Hibernate, pero todas están usando la configuración xml y configurando manualmente partes de la capa de persistencia.

Lo que quiero hacer es "configurar posteriormente" las partes requeridas de la capa de persistencia que Spring Boot crea para mí porque, si defino la mía, ya no uso la configuración automática de Spring Boot. ¿Puede alguien ayudarme a determinar si 1) esto es posible y 2) qué partes debo configurar y cómo?

¡Gracias!


Como [M. Deinum] mencionado en un comentario en mi publicación original, la solución es establecer:

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

En el archivo application.properties .

Además, este comportamiento se describe aquí (es fácil pasarlo por alto porque no se proporciona ningún ejemplo).