2015-08-26 27 views
5

Jackson deserializuje ciąg "null" jako pusty obiekt żądania, który jest oczekiwany (chociaż dobrze byłoby móc wyłączyć to zachowanie).Sprężyna 4 - odrzucenie "null" @RequestBody dla wszystkich punktów końcowych

Poniższy kod wyzwala sprawdzanie poprawności w przypadku ładunku "{}", ale nie w przypadku ładunku "zerowego". To zmusza mnie do zrobienia kolejnej kontroli dla ładunku pustego, co nie wydaje mi się normalne, ponieważ PayloadValidator może zawierać samo sprawdzanie zerowej wartości.

@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. Czy istnieje sposób ogólny odrzucenia zerowej @RequestBody całkowicie (czyli dla wszystkich punktów końcowych)?
  2. Jeśli nie, czy mogę mieć całą logikę walidacji w jednym miejscu i być automatycznie wyzwalana (tj. Przez @Validated lub @Valid)?

Dziękuję Emanuela

Odpowiedz

2

@RequestBody adnotacja ma atrybut required który true domyślnie, więc wnioskować z pustym ciała nie powinna działać tu i serwer powinien odpowiedzieć za pomocą HTTP 400 błędów.

W tym przypadku ładunek o wartości "null" skutecznie oznacza, że ​​treść żądania nie jest pusta, a Jackson będzie deserializować ją jako wartość null. W tym przypadku nie sądzę, że zostanie uruchomione sprawdzanie poprawności @Validated, które pozostawia ci aktualną aranżację.

Jak wskazano w Twoim numerze, zostało to rozwiązane za pomocą SPR-13176 w Spring Framework 4.2+.

+0

Dzięki, otworzyłem [wydanie jiry] (https://jira.spring.io/browse/SPR-13490) –