Java Spring启动,Spring MVC JSON请求体:忽略未知属性

Java Spring启动,Spring MVC JSON请求体:忽略未知属性,java,json,spring,spring-boot,jackson,Java,Json,Spring,Spring Boot,Jackson,我们正在开发一个JSON web服务,以通过@RequestBody注释接收数据。如果请求中包含一个与反序列化bean不匹配的属性,我们希望得到HTTP 400(错误请求)响应,但该属性被忽略。以下是一个例子: @RestController @Slf4j public class TestController { @RequestMapping(method = RequestMethod.POST, value = "/query") public void parse(@Requ

我们正在开发一个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;
}
发帖时

{ "from" : "123", "to": "456", "foo" : "bar" }
我们得到一个HTTP 200响应。在这种情况下,我们如何使SpringMVC返回HTTP400

非常感谢您的帮助或指点

请注意,这与此问题不同:

因为这个问题问的是当预期的属性不存在时如何返回400

这个怎么样-

 private String to;
对比

{ "from" : "123", "foo" : "bar" }

我想你是在把foo作比较。因此反序列化失败。

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

ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);

在本例中,未知属性将抛出
JsonMappingException
,您可以引入自定义异常处理程序,在本例中返回400响应

将其放入application.properties:

spring.jackson.deserialization.FAIL_ON_UNKNOWN_PROPERTIES=true

以下是相关文档:

您可以对此作业使用验证,验证程序将检查这些字段是否为空,如果为空,spring将返回
400错误错误请求
,下面是您的操作方法:

在您的Bean中:

public class A {
@NotNull
private String firstName;

   public String getFirstName() {
       return firstName;
   }

    public void setFirstName(String firstName) {
       this.firstName = firstName;
   }
}
@ResponseBody
@RequestMapping(path = "/rest")
public B treatRequest(@RequestBody @Validated A a) {...}
在您的控制器中:

public class A {
@NotNull
private String firstName;

   public String getFirstName() {
       return firstName;
   }

    public void setFirstName(String firstName) {
       this.firstName = firstName;
   }
}
@ResponseBody
@RequestMapping(path = "/rest")
public B treatRequest(@RequestBody @Validated A a) {...}
在配置文件中,您应该像这样激活验证(可能您已经准备好了):



您是否尝试过:返回新的响应属性(HttpStatus.Bad\u请求);Spring应该为我做这件事,以防反序列化失败。然后我会再次飞走,我在这方面不是专家-好运气谢谢你的帮助。你在使用Spring Boot吗?还是纯弹簧mvc?不,它不会失败。我希望它会失败,但它不会。说得对。但这会有帮助吗?我可能应该在Spring使用的SpringBean上这样做?我会试着搜索我从哪里得到的豆子。谢谢。这里似乎有一些帮助:SpringJackson反序列化Bean的定制是使用应用程序属性完成的。请参阅下面我的答案。应用程序属性是什么意思?详细说明answerapplication.properties是Spring的主要配置文件。您也可以使用application.yml.application.properties,它是Spring引导的专用工具,而不是Spring的通用工具。相反,我要求如果给出的字段不是预期的,则失败。见下面我的答案。