Spring 4 - 拒绝所有端点的 "null" @RequestBody

Spring 4 - reject "null" @RequestBody for all endpoints

Jackson 将 "null" 字符串反序列化为预期的空请求主体(尽管能够关闭此行为会很好)。

下面的代码会在“{}”有效载荷的情况下触发验证,但在 "null" 有效载荷的情况下不会。这迫使我对空负载进行另一次检查,这对我来说似乎不正常,因为 PayloadValidator 可能包含空检查本身。

@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. 是否有一种通用的方法来完全拒绝 null @RequestBody(即对于所有端点)?
  2. 如果没有,我能否将所有验证逻辑放在一个地方并自动触发(即通过@Validated 或@Valid)?

谢谢, 伊曼纽尔

@RequestBody 注释有一个属性 required,默认情况下是 true,所以带有空正文的请求在这里不起作用,服务器应该响应 HTTP 400 错误.

在这种情况下,"null" 有效负载实际上意味着请求正文不为空,Jackson 会将其反序列化为 null 值。在这种情况下,我认为 @Validated 验证不会被触发,这让您保留当前的安排。

正如您在问题中所指出的,Spring Framework 4.2+ 中的 SPR-13176 已解决此问题。