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

Posted

技术标签:

【中文标题】Spring Boot,Spring MVC JSON RequestBody:未知属性被忽略【英文标题】:Spring Boot, Spring MVC JSON RequestBody: Unknown property ignored 【发布时间】:2016-06-26 13:15:58 【问题描述】:

我们正在开发一个 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 响应。在这种情况下,我们如何让 Spring MVC 返回 HTTP 400?

非常感谢任何帮助或指示。

请注意,这与此问题不同:How to return 400 HTTP error code when some property of a RequestBody parameter is null?。

因为该问题询问如何在缺少预期属性时返回 400。

【问题讨论】:

你试过了吗:return new ResponseEntity(HttpStatus.Bad_request); docs.spring.io/spring/docs/current/javadoc-api/org/… Spring 应该为我做这件事,以防反序列化失败。 那我就飞走了,我不是这方面的专家-祝你好运 感谢您的帮助。 你在使用 Spring Boot 吗?还是普通的spring mvc? 【参考方案1】:

把这个放到application.properties中:

spring.jackson.deserialization.FAIL_ON_UNKNOWN_PROPERTIES=true

以下是相关文档:Customize the Jackson ObjectMapper

【讨论】:

应用程序属性是什么意思?详细回答 application.properties 是 Spring 的主要配置文件。你也可以使用 application.yml。 实际上 application.properties 是 Spring Boot 特有的,一般不是 Spring。【参考方案2】:

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

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

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

【讨论】:

好点。但这会有帮助吗?我可能应该在 Spring 使用的 Spring Bean 上执行此操作?我会尝试搜索我从哪里得到那个 Bean。谢谢。 好像这里有一些帮助:docs.spring.io/spring-boot/docs/current/reference/html/… Spring Jackson 反序列化 Bean 的自定义是使用应用程序属性完成的。请参阅下面的答案。【参考方案3】:

这个怎么样 -

 private String to;

对比

 "from" : "123", "foo" : "bar" 

我认为您是在将 tofoo 进行比较。所以反序列化失败了。

【讨论】:

没有。它不会失败。我预计它会失败,但它不会。【参考方案4】:

您可以为此 Job 使用 Validation ,验证器将检查这些字段是否不为 null ,如果是,则 spring 将返回 400 error bad request 所以这是您的操作方法:

在你的 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) ...

在您的配置文件中,您应该像这样激活验证(可能您已经拥有它):

    <mvc:annotation-driven/>

【讨论】:

我不是要求验证某些字段是否为空。相反,如果给出了字段,我要求失败,这是不期望的。请参阅下面的答案。

以上是关于Spring Boot,Spring MVC JSON RequestBody:未知属性被忽略的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot和spring MVC之间的区别[重复]

spring boot与spring mvc的区别

spring boot与spring mvc的区别是什么?

Spring,Spring MVC及Spring Boot区别

Spring,Spring MVC及Spring Boot区别

Spring Web-mvc 不适用于 Spring Boot [Spring cloud]