2015-08-26 21 views
5

Jackson deserializes chuỗi "null" như là một cơ thể yêu cầu rỗng được mong đợi (mặc dù nó sẽ là tốt đẹp để có thể chuyển đổi hành vi này).Mùa xuân 4 - từ chối "null" @RequestBody cho tất cả các thiết bị đầu cuối

Mã bên dưới kích hoạt xác thực trong trường hợp trọng tải "{}" nhưng không phải trong trường hợp trọng tải "không". Điều này buộc tôi phải làm một kiểm tra khác cho payload null mà không có vẻ bình thường với tôi kể từ khi PayloadValidator có thể bao gồm kiểm tra null chính nó.

@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ó một cách chung chung của việc từ chối @RequestBody rỗng hoàn toàn (ví dụ: cho tất cả các thiết bị đầu cuối)?
  2. Nếu không, tôi có thể có tất cả logic xác thực ở một nơi và được kích hoạt tự động (tức là thông qua @Validated hoặc @Valid) không?

Cảm ơn bạn, Emanuel

Trả lời

2

Các @RequestBody chú thích có một thuộc tính required đó là true theo mặc định, vì vậy yêu cầu với một cơ thể trống rỗng không nên làm việc ở đây và máy chủ nên phản ứng với một HTTP 400 lỗi.

Trong trường hợp này, trọng tải "null" hiệu quả có nghĩa là phần thân yêu cầu không phải là rỗng và Jackson sẽ hủy kích hoạt nó dưới dạng giá trị null. Trong trường hợp này, tôi không nghĩ rằng việc xác thực @Validated được kích hoạt, điều này sẽ khiến bạn có sắp xếp hiện tại của mình.

Như được chỉ ra trong vấn đề của bạn, điều này đã được giải quyết với SPR-13176 trong Spring Framework 4.2+.

+0

Cảm ơn, đã mở [vấn đề jira] (https://jira.spring.io/browse/SPR-13490) –

Các vấn đề liên quan