web-dev-qa-db-fra.com

Comment désactiver la validation Hibernate dans un projet Spring Boot

J'ai un projet de démarrage de printemps qui a un CrudRepository, une entité et un contrôleur. J'essaie essentiellement de conserver une entité sur la base des données transmises au contrôleur.

Pour ce faire, j'utilise spring-boot-starter-jpa. Mon entité est annotée avec des annotations JSR-303, qui sont vérifiées dans le contrôleur avant que les données soient transmises au CrudRepository pour la persistance.

Méthode du contrôleur:

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

Entité:

@Entity /* JPA */
public class User {

   @Id /* JPA */
   @Column(name="email_address", nullable=false, length=255) /* JPA */
   @UserUnique
   private String emailAddress;

}

La cause de mes problèmes est l'annotation UserUnique. Son validateur ressemble à ceci:

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

Ce qui semble se produire, c'est que la validation est exécutée deux fois. Une fois dans le contrôleur via le @Valid annotation, et une fois quand Hibernate essaie de faire persister l'objet. Cependant, lorsque Hibernate essaie de persister l'objet, il lance:

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

Cela semble être dû au fait qu'il n'est pas sensible aux ressorts et ne peut pas injecter la dépendance dans le constructeur. Donc, ce que je veux faire, c'est désactiver complètement la validation Hibernate (car elle est redondante et se produit déjà dans le contrôleur).

Il semble y avoir une propriété appelée javax.persistence.validation.mode que vous pouvez définir sur none. Cependant, je ne peux pas pour la vie de moi trouver où le placer dans une configuration basée sur le code.

Je me rends compte qu'il y a des questions comme injection de dépendance JSR-303 et Hibernate mais elles utilisent toutes la configuration xml et configurent manuellement des parties de la couche de persistance.

Ce que je veux faire, c'est "post-configurer" les parties requises de la couche de persistance que Spring Boot crée pour moi, car si je définis la mienne, je ne tire plus parti de la configuration automatique de Spring Boot. Quelqu'un peut-il m'aider à déterminer si 1) cela est possible et 2) quelles parties dois-je configurer et comment?

Merci!

27
Erin Drummond

Comme [M. Deinum] mentionné dans un commentaire sur mon post d'origine, la solution est de définir:

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

Dans le application.properties fichier.

De plus, ce comportement est décrit ici (c'est facile à manquer car aucun exemple n'est fourni).

28
Erin Drummond