我有一个基本的User DTO类...
public class User {
@JsonProperty("firstName")
private String firstName;
@JsonProperty("lastName")
private String lastName;
}
...以及@RestController类中的基本请求处理程序:
@RequestMapping(path = "/users", method = RequestMethod.POST, consumes = { MediaType.APPLICATION_JSON_VALUE })
public UserMessage createUser(@RequestBody User user){
return userService.createUser(user);
}
如何限制传入的JSON有效负载最多仅包含必需的密钥? 即接受此有效载荷:
{
"firstName":"foo",
"lastName":"bar"
}
并为此抛出一个自定义异常:
{
"firstName":"foo",
"lastName":"bar",
"type":"admin",
"asdf":"asdf"
}
我阅读了有关自定义Converters,ArgumentResolvers的信息,我相信我可以简单地在处理程序中放置一个附加Map参数并在调用服务之前进行验证,但是我想知道处理此问题的“最佳”方法。
答案 0 :(得分:1)
在您的示例中,对于User
bean来说,已经不可能了,可以映射除firstName
和lastName
之外的其他潜在JSON字段,仅仅是因为User
中没有可以保存相关数据的字段。
您问题中的User
bean应该不完整,例如为简单起见,并包含更多字段,那么只要您未将com.fasterxml.jackson.databind.DeserializationFeature#FAIL_ON_UNKNOWN_PROPERTIES配置为respective Deserialization docs => false ,或者使用您的bean上的注释ObjectMapper
。
总结:杰克逊的默认行为是@JsonIgnoreProperties(ignoreUnknown = true)
有关更多信息,您还可以咨询{{3}}。
答案 1 :(得分:0)
解决了该问题,该线程帮助了 @JsonIgnoreProperties(ignoreUnknown=false) is not working in Spring 4.2.0 and upper version
mle,您的回答不正确,因为我使用的是最新版本的Spring Framework,并且默认情况下ObjectMapper的FAIL_ON_UNKNOWN_PROPERTIES
已关闭。另外,我还需要在User DTO类中设置@JsonIgnoreProperties(ignoreUnknown = false)
(因为实际类的超类将此设置为true)。
对其进行了测试,就像魅力一样运行,而自定义错误可以在带有注释的@ExceptionHandler(HttpMessageNotReadableException.class)
处理程序中处理。