2015-08-26 18 views
5

Jackson deserializza la stringa "null" come corpo di richiesta null che è previsto (anche se sarebbe bello poter disattivare questo comportamento).Spring 4 - reject "null" @RequestBody per tutti gli endpoint

Il codice seguente attiva la convalida in caso di carico utile "{}" ma non in caso di carico utile "nullo". Questo mi obbliga a fare un altro controllo per il carico utile nullo che non mi sembra normale dal momento che PayloadValidator potrebbe includere il controllo nulla stesso.

@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. C'è un modo generico di rigetto @RequestBody nullo del tutto (cioè per tutti gli endpoint)?
  2. In caso contrario, è possibile avere tutta la logica di convalida in un posto e essere attivata automaticamente (ovvero tramite @Validated o @Valid)?

Grazie, Emanuel

risposta

2

Il @RequestBody annotazione ha un attributo required che è true di default, quindi richiesta con un corpo vuoto non dovrebbe funzionare qui e il server dovrebbe rispondere con un errore HTTP 400.

In questo caso, un carico utile "null" significa che il corpo della richiesta non è nullo e che Jackson lo deserializza come valore null. In questo caso, non penso che sia stata attivata la convalida @Validated, che ti lascia con la tua disposizione attuale.

Come indicato nel problema, questo è stato risolto con SPR-13176 in Spring Framework 4.2+.

+0

Grazie, aperto un [problema jira] (https://jira.spring.io/browse/SPR-13490) –