Spring Boot,Spring MVC JSON RequestBody:忽略未知属性

use*_*468 6 java spring json jackson spring-boot

我们正在开发一个JSON Web服务,通​​过@RequestBody注释接收数据.如果请求中包含的属性与反序列化的bean不匹配,我们期望HTTP 400(错误请求)响应,但是简单地忽略该属性.这是一个例子:

@RestController
@Slf4j
public class TestController {

  @RequestMapping(method = RequestMethod.POST, value = "/query")
  public void parse(@RequestBody Query query) {
    log.info("Received query: {}", query.toString());
  }
}


@Data
class Query {
  private String from;
  private String to;
}
Run Code Online (Sandbox Code Playgroud)

发布时

{ "from" : "123", "to": "456", "foo" : "bar" }
Run Code Online (Sandbox Code Playgroud)

我们得到HTTP 200响应.在这种情况下,我们如何让Spring MVC返回HTTP 400?

任何帮助或指针都非常感谢.

请注意,这与此问题不同:如果RequestBody参数的某些属性为null,如何返回400 HTTP错误代码?.

由于该问题询问如何在缺少预期财产时返回400.

use*_*468 8

我找到了答案:

把它放到application.properties中:

spring.jackson.deserialization.FAIL_ON_UNKNOWN_PROPERTIES=true
Run Code Online (Sandbox Code Playgroud)

以下是相关文档:https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper


Ily*_*hin 6

您可以重新配置您的杰克逊(假设您正在使用它)ObjectMapper在未知属性上失败.

ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您的未知属性将抛出JsonMappingException ,您可以引入自定义异常处理程序以在此情况下返回Response 400.