wake-up-neo.com

Deaktivieren der Ruhezustandsüberprüfung in einem Spring Boot-Projekt

Ich habe ein Spring Boot-Projekt, das ein CrudRepository, eine Entität und einen Controller hat. Ich versuche im Grunde, eine Entität auf der Grundlage der an den Controller übergebenen Daten beizubehalten.

Dazu verwende ich spring-boot-starter-jpa. Meine Entität wird mit JSR-303-Anmerkungen versehen, die im Controller überprüft werden , bevor die Daten zur Persistenz an das CrudRepository übergeben werden.

Controller-Methode:

@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ät:

@Entity /* JPA */
public class User {

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

}

Die Ursache meiner Probleme ist die Anmerkung UserUnique. Sein Validator sieht folgendermaßen aus:

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

Was zu passieren scheint, ist, dass die Validierung zweimal ausgeführt wird. Einmal im Controller über die Annotation @Valid Und einmal, wenn Hibernate versucht, das Objekt beizubehalten. Wenn Hibernate versucht, das Objekt beizubehalten, wird jedoch Folgendes ausgelöst:

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

Dies scheint daran zu liegen, dass es nicht frühlingsbewusst ist und die Abhängigkeit nicht in den Konstruktor einschleusen kann. Ich möchte also die Überprüfung des Ruhezustands vollständig deaktivieren (da sie redundant ist und bereits im Controller stattfindet).

Es scheint eine Eigenschaft namens javax.persistence.validation.mode Zu geben, die Sie auf none setzen können. Allerdings kann ich nicht für mein ganzes Leben herausfinden, wo ich es in einer Code-basierten Konfiguration einstellen soll.

Mir ist klar, dass es Fragen wie JSR-303 Dependency Injection und Hibernate gibt, aber diese verwenden alle xml config und konfigurieren Teile der Persistenzschicht manuell.

Ich möchte die erforderlichen Teile der von Spring Boot für mich erstellten Persistenzebene "nachkonfigurieren", da ich die automatische Konfiguration von Spring Boot nicht mehr nutze, wenn ich meine eigene definiere. Kann mir jemand helfen festzustellen, ob 1) dies möglich ist und 2) welche Teile ich konfigurieren muss und wie?

Vielen Dank!

27
Erin Drummond

As [M. Deinum] in einem Kommentar zu meinem ursprünglichen Beitrag erwähnt, ist die Lösung zu setzen:

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

In dem application.properties Datei.

Darüber hinaus ist dieses Verhalten hier beschrieben (leicht zu übersehen, da kein Beispiel angegeben ist).

28
Erin Drummond