Welcher Typ von exception zu werfen, die im Frühjahr RestController, wenn die Validierung fehlschlägt?
Im Frühjahr RestController
ich habe ein input-Validierung der RequestBody
einfach durch kommentieren der entsprechenden parameter der Methode als @Valid
oder @Validated
. Einige andere überprüfungen können nur durchgeführt werden, nachdem einige der Verarbeitung der eingehenden Daten. Meine Frage ist, welche Art von Ausnahmen sollte ich verwenden, sodass er etwa die Ausnahme, die ausgelöst durch die @Valid
annotation, und wie gestalte ich diese Ausnahme aus der überprüfung ergeben. Hier ist ein Beispiel:
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<?> createOrder(@RequestBody @Validated(InputChecks.class) Order order) {
//Some processing of the Order goes here
Set<ConstraintViolation<Order>> violations = validator.validate(order, FinalChecks.class);
//What to do now with the validation errors?
orders.put(order);
HttpHeaders headers = new HttpHeaders();
headers.setLocation(ServletUriComponentsBuilder.fromCurrentRequest().path("/" + order.getId()).build().toUri());
return new ResponseEntity<>(null, headers, HttpStatus.CREATED);
}
InformationsquelleAutor Gregor | 2016-03-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mir die einfachste Art und Weise sieht, wie die überprüfung der Objekt mit einem Fehler-Objekt, und verwenden Sie es in einem MethodArgumentNotValidException.
Diese Weise die gefundenen Fehler, die während des zweiten validierungsschritt haben genau die gleiche Struktur wie die gefundenen Fehler während der überprüfung von Eingaben auf der @validierte Parameter.
Ich werde zweite, was @Narasimha sagt, die MethodParameter ist nicht sehr nützlich bei der Konstruktion der form error response, lass es einfach null a) weil hässlich, b) kann es zu einem Fehler, wenn die Signatur ändert.
InformationsquelleAutor Gregor
Für die Handhabung der Validierung Fehler im zweiten Lauf, den ich denken kann, drei verschiedene Ansätze. Erste, können Sie extrahieren Sie die Validierung Fehlermeldungen aus
Set
vonConstraintViolation
s und dann eine entsprechende HTTP-response, sagen400 Bad Request
mit Validierungsfehler als Antwort body:Dieser Ansatz eignet sich für Situationen, wenn die Doppel-Validierung ist eine Voraussetzung für ein paar Reglern. Ansonsten ist es besser, zu werfen, einem brandneuen
Exception
oder Wiederverwendung Frühjahr zugehörigen Ausnahmen, sagenMethodArgumentNotValidException
" und definieren Sie einenControllerAdvice
, Griff Sie universell:Und der controller-Tipp:
Können Sie auch werfen eine Feder Ausnahmen wie
MethodArgumentNotValidException
. Um dies zu tun, müssen Sie zum konvertieren vonSet
vonConstraintViolation
s zu einer Instanz vonBindingResult
und übergeben es an dieMethodArgumentNotValidException
's Konstruktor.Aktualisiert die Antwort...
Was
ValidationException
ist das? Es gibt keinejavax.validation.ValidationException.getViolations()
...Es ist eine benutzerdefinierte Ausnahme, irgendwie impliziert
it's better to throw a brand new Exception...
. Ich bin damit einverstanden, ich sollte etwas präziser werdenOh ich sehe. Ich dachte, Sie könnte gemeint haben
o.s.v.BindException
oder so etwas.InformationsquelleAutor Ali Dehghani