有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

非常感谢您的帮助或指点

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

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


共 (4) 个答案

  1. # 1 楼答案

    把这个应用起来。属性:

    spring.jackson.deserialization.FAIL_ON_UNKNOWN_PROPERTIES=true
    

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

  2. # 2 楼答案

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

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

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

  3. # 3 楼答案

    这个怎么样-

     private String to;
    

    对比

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

    我想你是在比较foo。所以反序列化失败了

  4. # 4 楼答案

    您可以对该作业使用验证,验证程序将检查这些字段是否为空,如果为空,spring将返回400 error bad request,因此以下是您的操作方法:

    在你的豆子里:

    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/>