Spring Data Rest Validierung Confusion

8

Suchen Sie nach Hilfe für die Überprüfung der Spring-Datenruhe in Bezug auf die ordnungsgemäße Behandlung von Validierungsfehlern:

Ich bin so mit den Dokumenten bezüglich der Validierung der Federdatenruhe verwirrt: Ссылка

Ich versuche, die Validierung für einen POST-Aufruf richtig zu behandeln, der versucht, eine neue Unternehmenseinheit zu speichern

Ich habe diese Entität:

%Vor%

...

und diese RestResource dao

%Vor%

POST-Anfrage an api / Firmen:

%Vor%

Wenn ich einen POST mit einem Nullnamen ausstelle, erhalte ich die folgende Ruheantwort mit httpcode 500

{"timestamp": 1455131008472, "status": 500, "error": "Interner Serverfehler", "Ausnahme": "javax.validation.ConstraintViolationException", "message": "Validierung fehlgeschlagen für Klassen [com. domain.Company] während der persistenten Zeit für Gruppen [javax.validation.groups.Default,] \ nListe der Constraint-Verletzungen: [\ n \ tConstraintViolationImpl {interpolatedMessage = 'darf nicht null sein', propertyPath = name, rootBeanClass = class com.domain .Company, messageTemplate = '{javax.validation.constraints.NotNull.message}'} \ n] "," Pfad ":" / api / companies / "}

Ich habe versucht, die folgende Bean zu erstellen, aber es scheint nie etwas zu tun:

%Vor%

Und selbst wenn es funktioniert, wie würde es mir helfen, eine bessere Fehlerreaktion mit einem richtigen http-Code und einer verständlichen json-Antwort zu entwickeln?

so verwirrt

mit 1.3.2.RELEASE

%Vor%     
1977 10.02.2016, 19:15
quelle

3 Antworten

6

@Mathias Es scheint, dass das Folgende genug ist, damit jsr 303-Annotationen überprüft werden können und dass es automatisch einen http-Code von 400 mit netten Nachrichten zurückgibt (ich brauche nicht einmal die Klassen BeforeCreateCompanyValidator oder BeforeSaveCompanyValidator):

%Vor%

}

response 404, {"errors": [{"entity": "Firma", "message": "darf nicht null sein", "invalidValue": "null", "property": "name"}, { "entity": "Firma", "Nachricht": "darf nicht null sein", "invalidValue": "null", "Eigenschaft": "Adresse"}]}

    
1977 11.02.2016 11:58
quelle
3

Ich denke, Ihr Problem ist, dass die Bean-Validierung zu spät erfolgt - es wird auf der JPA-Ebene durchgeführt, bevor es persistiert. Ich habe festgestellt, dass - anders als Spring mvc - spring-data-rest keine Bean-Validierung durchführt, wenn eine Controller-Methode aufgerufen wird. Sie benötigen dafür eine zusätzliche Konfiguration.

Sie möchten, dass spring-data-rest Ihre Bean validiert - das gibt Ihnen nette Fehlermeldungen und einen korrekten HTTP-Return-Code.

Ich habe meine Validierung im Frühling-Daten-Rest wie folgt konfiguriert:

%Vor%

Wenn die Bean-Validierung und / oder mein benutzerdefinierter Validator Fehler findet, erhalte ich eine 400 - ungültige Anfrage mit einer solchen Nutzlast:

%Vor%     
Mathias Dpunkt 11.02.2016 09:20
quelle
0

Die Antworten von @Mathias und @ 1977 reichen für normale Spring Data REST -Aufrufe aus. In Fällen, in denen Sie benutzerdefinierte @RepositoryRestController s schreiben müssen, verwenden Sie @RequestBody und @Valid JSR-303 Anmerkungen funktionierte nicht für mich.

Also, als Ergänzung zu der Antwort, habe ich im Fall von benutzerdefiniertem% ​​co_de% s mit @RepositoryRestController und @RequestBody Annotation das folgende @Valid hinzugefügt:

%Vor%     
Yuriy Yunikov 09.03.2017 09:35
quelle