2016-04-05 5 views
2

Ich benutze Spring Data Rest und alles läuft gut.Spring Daten Rest Validierung + Ausnahme Mapper: verwirrend

Ich möchte Validierung (JSR 303) auf meine Entitäten anwenden.

Die Feder Dokumentation sagen, dass ich Anwendungsereignisse auf ein paar Arten abfangen kann (von denen ich nicht zur Arbeit kommen kann, und im Moment scheint spring.io ausgefallen zu sein).

Allerdings habe ich es Arbeit erhalten, indem

@Validated

auf meinem respository setzen:

@Validated 
@RepositoryRestResource(collectionResourceRel = "workers", path = "workers") 
public interface WorkerRepository extends PagingAndSortingRepository<Worker, Long> { 

} 

Und es wird eine Ausnahme werfen. Das Problem ist, es ist eine Feder Ausnahme und nicht einmal die Wurzel ein, und ich muss grundsätzlich die Validierungen nehmen und sie in eine benutzerdefinierte Entität Nutzlast:

{ 
    "foo": "must be of length 10", 
    "baz": "Must match pattern '[A-Z]+'" 
} 

So, kurz gesagt, ich will

  • Validate ein Unternehmen JSR mit 303
  • eine HTTP-Einheit Produce mit 400: und einer Zuordnung oder Feld -> Fehler

Was ist der einfachste Weg, dies zu tun? stolperte ich auch dazu:

Detected @ExceptionHandler methods in repositoryRestExceptionHandler 

Welche verdächtig nützlich scheint. Wenn ich diese Klasse auschecke sieht es so aus, als ob ich sicher brauche

Antwort

3

Der Spring Data Rest übernimmt die Bean-Validierung nicht automatisch. Wenn Sie eine Bean-Validierung durchführen möchten, müssen Sie den entsprechenden Validator im Frühjahrsdatenspeicher registrieren.

Die folgende Konfiguration macht den Trick für mich:

@Configuration 
public class MyValidationConfiguration extends RepositoryRestConfigurerAdapter { 

    @Bean 
    @Primary 
    /** 
    * Create a validator to use in bean validation - primary to be able to autowire without qualifier 
    */ 
    Validator validator() { 
     return new LocalValidatorFactoryBean(); 
    } 

    @Override 
    public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) { 
     Validator validator = validator(); 
     //bean validation always before save and create 
     validatingListener.addValidator("beforeCreate", validator); 
     validatingListener.addValidator("beforeSave", validator); 
    } 
} 

Mit dieser Konfiguration jede Entität, die Bohne Validierung Einschränkungen hat, wird vor der Aktualisierung validiert und erstellen.

(Dies aktiviert nicht die Bean-Validierung für benutzerdefinierte Controller in einem Projekt mit Federdatenablage - aber das ist nicht das, wonach Sie fragen - oder?

)
  • die Feder Daten Rest Validierungsmechanismus eine RepositoryConstraintViolationException
  • wirft die durch RepositoryRestExceptionHandler
  • die RepositoryConstraintViolationExceptionMessage

So ein Prüfungsfehlerantwort führen würde, wie serialisiert in den Fehlern führt behandelt wird in einem 400 Bad Request mit einem Körper wie diesem:

{ 
    "errors" : [ { 
    "entity" : "MyEntity", 
    "message" : "may not be null", 
    "invalidValue" : "null", 
    "property" : "price" 
    }, { 
    "entity" : "MyEntity", 
    "message" : "may not be empty", 
    "invalidValue" : "", 
    "property" : "name" 
    } 
} 

Benutzerdefinierte Controller

Sie Ihre Feder-data-Rest application events die Feder-data-Rest Einheit Lifecycle mit registrierten Validatoren nutzen können. z.B. Sie können in Ihrem benutzerdefinierten Controller einen BeforeSaveEvent ausgeben, um alle Ihre Ereignisbehandlungsroutinen und auch den Überprüfungsereignis-Listener auszulösen, den spring-data-rest bereitstellt. Damit können Sie erreichen, dass Sie die gleichen Fehler und Fehlerdarstellungen erhalten.

+0

Das sieht aus wie es funktionieren könnte und es ist, was ich brauche. Aber ich muss abfangen, was mit diesen Validierungsfehlern passiert. –

+0

@ChristianBongiorno - danke für den Hinweis - Ich habe meinem Beitrag noch ein paar Details hinzugefügt - die Konfiguration ist alles, was Sie brauchen - der Rest ist bereits im Frühjahr-Daten-Rest gesorgt –

+0

@MathiasDpunkt große Antwort, sondern in der Tat, wie Würden Sie ein ähnliches Verhalten für benutzerdefinierte Steuerungen für Federdaten-Ruhe erzielen? – m4rtin

0

im Allgemeinen wird es eine schmerzhafte sein, müssen Sie eine vollständige Kontrolle unter Überwinterungsliste der Constrains Verletzungen zu nehmen. MethodValidationPostProcessor kann Ihnen helfen, den Validierungsprozess für @validierte Schnittstellen/Klassen auszulösen. Wenn Ihr Rückgabeobjekt oder Argument Ihre komplexe Klasse ist, muss sie auch als @Valid markiert sein.

Nächster Artikel können Sie ein wenig helfen: https://dzone.com/articles/method-validation-spring-31

Leider habe ich nicht so etwas wie feder webmvc gefunden hat Databinding-Mechanismus, der Fehler mit Wandlungs-/Validierung Probleme an einem Ort berichtet (und es sieht es nicht kann (kann irgendwie wiederverwendbar sein)

+0

Ich werde dies versuchen, danke –

Verwandte Themen