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
}
- 是否有一种通用的方法来完全拒绝 null @RequestBody(即对于所有端点)?
- 如果没有,我能否将所有验证逻辑放在一个地方并自动触发(即通过@Validated 或@Valid)?
谢谢,
伊曼纽尔
@RequestBody
注释有一个属性 required
,默认情况下是 true
,所以带有空正文的请求在这里不起作用,服务器应该响应 HTTP 400 错误.
在这种情况下,"null"
有效负载实际上意味着请求正文不为空,Jackson 会将其反序列化为 null
值。在这种情况下,我认为 @Validated
验证不会被触发,这让您保留当前的安排。
正如您在问题中所指出的,Spring Framework 4.2+ 中的 SPR-13176 已解决此问题。
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
}
- 是否有一种通用的方法来完全拒绝 null @RequestBody(即对于所有端点)?
- 如果没有,我能否将所有验证逻辑放在一个地方并自动触发(即通过@Validated 或@Valid)?
谢谢, 伊曼纽尔
@RequestBody
注释有一个属性 required
,默认情况下是 true
,所以带有空正文的请求在这里不起作用,服务器应该响应 HTTP 400 错误.
在这种情况下,"null"
有效负载实际上意味着请求正文不为空,Jackson 会将其反序列化为 null
值。在这种情况下,我认为 @Validated
验证不会被触发,这让您保留当前的安排。
正如您在问题中所指出的,Spring Framework 4.2+ 中的 SPR-13176 已解决此问题。