Java Spring启动,Spring MVC JSON请求体:忽略未知属性
我们正在开发一个JSON web服务,以通过@RequestBody注释接收数据。如果请求中包含一个与反序列化bean不匹配的属性,我们希望得到HTTP 400(错误请求)响应,但该属性被忽略。以下是一个例子: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
@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的通用工具。相反,我要求如果给出的字段不是预期的,则失败。见下面我的答案。