Null-request-body nicht immer gefangen von Spring @RequestBody @Gültig Anmerkungen
Ich bin derzeit in ein Problem mit der @RequestBody
annotation im Frühjahr. Ich habe derzeit alle meine Validierung Anmerkungen auf meine Modelle richtig, und Sie arbeiten groß, wenn ein Objekt Gebucht wird. Alles wie erwartet funktioniert, auch wenn der request-body geschrieben ist vollständig leer, oder ein leeres Objekt "{}". Das problem entsteht, wenn jemand versucht, ein post-request-body von "null". Irgendwie bekommt durch die @Valid
annotation und wird nicht abgefangen, was zu einem NullPointerException
wenn ich versuche, auf das Objekt zuzugreifen. Habe ich eingefügt, ein Ausschnitt von meinem controller unten.
@Secured({ ROLE_ADMIN })
@RequestMapping(method = RequestMethod.POST, consumes = { MediaType.APPLICATION_JSON_VALUE } )
public HttpEntity<Resource<Item>> addItem(@RequestBody @Valid Item item) throws Exception {
Resource<Item> itemResource = this.itemResourceAssembler.toResource(this.itemService.save(item));
return new ResponseEntity<Resource<Item>>(itemResource, HttpStatus.CREATED);
}
Habe ich einige Prüfungen in itemService.save()
zu sehen, ob ein Element in der Datenbank existiert bereits, seit dieses wird als upsert. Wenn ich den Zugriff auf das Element übergeben zu speichern bekomme ich die NullPointerException
weil Element null ist. Ich habe versucht, mit der "required" - parameter von @RequestBody
aber nur überprüfen, um zu sehen, ob es etwas Gepostet. Wie oben erwähnt, das null-Element wird nur Durchlaufen, wenn ein Benutzer Beiträge "null" ohne die Anführungszeichen als Text der Anforderung. Gibt es eine automatisierte Frühjahr Anmerkungen oder die Konfiguration zu beenden diese null von Durchlaufen, oder sollte ich einfach if(item == null) throw new Exception();
in alle meine Controller, wo diese könnten auftauchen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Durch die Blicke der code-snippet, das Sie geschrieben, Sie haben eine klar definierte service-Schicht. Ich würde vorschlagen, mit Methode-level-Validierung in der Sie Dienst wie folgt
Wenn Ihr mit spring XML-config fügen Sie diese zu Ihrem app-Kontext-xml.
einen MethodConstraintViolationException geworfen werden könnten, gefangen in einem @ControllerAdvice wenn Sie das definiert.
Happy Coding!
Entsprechend der JSON-Spezifikation,
null
ist ein Gültiger Wert. Jackson, der Frühling setzt hinter den kulissen, deserialisiert einnull
JSON-Wert zu einem Java -null
Referenz.Müssen Sie tun, was Sie beschrieben, und überprüfen Sie es in Ihrer Steuerung. Alternativ können Sie auch erstellen Sie Ihre eigenen
HandlerMethodArgumentResolver
zu tun, dass für Sie.Let ' s put it this way: Wenn ein Objekt nicht existiert, dann kann es nicht ungültig werden.
@Valid
nur bewirkt, dass der Frühling um zu überprüfen, ob dieitem
Objekt entspricht mit einigen Regeln. Es überprüft nicht, ob es da ist. Wenn die Anfrage leer ist, oder ein leeres Objekt, wird der Vorgang beendet vor Validierung. Für die in der Standard-setup von Spring und Jackson diese beiden Fälle sind nicht erlaubt.So können Sie entweder auf null prüfen oder schreiben Sie eine Erweiterung, wie @Sotirios Delimanolis hingewiesen hat.