2015-08-26 10 views
5

Jackson deserialisiert die "Null" -String als Null-Anfrage-Körper, der erwartet wird (obwohl es schön wäre, dieses Verhalten auszuschalten).Spring 4 - "null" @RequestBody für alle Endpunkte ablehnen

Der folgende Code löst die Validierung bei "{}" - Nutzdaten aus, nicht jedoch bei "Null" -Nutzdaten. Dies zwingt mich zu einer weiteren Überprüfung auf Null-Payload, was mir nicht normal erscheint, da der PayloadValidator den Null-Check selbst enthalten könnte.

@InitBinder 
protected void initBinder(WebDataBinder binder) { 
    binder.setValidator(new PayloadValidator()); 
} 

@RequestMapping(method = POST, value = "/my/path/here") 
public ResponseEntity<String> create(
    @Validated @RequestBody Payload payload 
) { 
    if (payload == null) { 
    // Payload validation logic not in one place 
    } 
    // useful work here 
} 
  1. Gibt es eine generische Art und Weise insgesamt null @RequestBody abzulehnen (das heißt für alle Endpunkte)?
  2. Wenn nicht, kann ich die gesamte Validierungslogik an einem Ort haben und automatisch ausgelöst werden (d. H. Über @Validated oder @Valid)?

Danke, Emanuel

Antwort

2

Die @RequestBody Anmerkung ein Attribut required hat die true standardmäßig ist, so fordern Sie mit einem leeren Körper hier nicht funktionieren sollte, und der Server sollte mit einem HTTP-400-Fehler reagieren.

In diesem Fall bedeutet eine "null" Nutzlast effektiv, dass der Anfragetext nicht null ist und dass Jackson ihn als null-Wert deserialisiert. In diesem Fall glaube ich nicht, dass die @Validated Validierung ausgelöst wird, die Sie mit Ihrer aktuellen Anordnung verlässt.

Wie in Ihrem Problem erwähnt, wurde dies mit SPR-13176 in Spring Framework 4.2 + gelöst.

+0

Danke, öffnete ein [jira Problem] (https://jira.spring.io/browse/SPR-13490) –

Verwandte Themen