如何使用Spring限制JSON有效载荷包含其他字段?

时间:2019-04-01 12:40:37

标签: spring spring-mvc

我有一个基本的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参数并在调用服务之前进行验证,但是我想知道处理此问题的“最佳”方法。

2 个答案:

答案 0 :(得分:1)

在您的示例中,对于User bean来说,已经不可能了,可以映射除firstNamelastName之外的其他潜在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)处理程序中处理。