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"
我认为您是在将 to 与 foo 进行比较。所以反序列化失败了。
【讨论】:
没有。它不会失败。我预计它会失败,但它不会。【参考方案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,Spring MVC及Spring Boot区别