【问题标题】:Difference between an optional field not being present Vs field present with null value in rest request body可选字段不存在与休息请求正文中存在空值的字段之间的区别
【发布时间】:2023-03-07 23:49:02
【问题描述】:

有没有办法检查一个可选字段是否存在于请求正文中且值为空,或者它根本不存在于请求正文中。我有一个要求,如果一个可选字段存在且值设置为 null,我们需要一个例外,但如果该字段根本不存在,那被认为是好的。

在下面的示例中,operatorName 是一个可选字段:

Invalid Case:
{
    "creationDateTime": "2019-10-08",
    "requestedAmount": "2499",
    "operatorPhone": "1234567890",
    "operatorName": null 
}

Valid Case:

{
    "creationDateTime": "2019-10-08",
    "requestedAmount": "2499",
    "operatorPhone": "1234567890"
}

请建议是否有办法知道请求中是否存在 operatorName。默认情况下,如果字段不存在,Java 会将值设置为 null。

【问题讨论】:

    标签: java rest spring-boot


    【解决方案1】:

    您可以使用@JsonInclude(JsonInclude.Include.NON_NULL)

    如果你使用类来映射请求,默认情况下,如果字段不存在,Java 会将值设置为 null。

    您可以使用Map 来获取请求数据而不是类并检查密钥,

    @PostMapping(value = "/process", consumes = APPLICATION_JSON_VALUE)
    public ResponseEntity<String> process(@RequestBody Map data, HttpServletRequest request) throws IOException {
        if (data.containsKey("operatorName") && null == data.get("operatorName"))
            return ResponseEntity.badRequest().body("operatorName can not be null");
        //valid process
        return ResponseEntity.ok("success");
    }
    

    【讨论】:

    • 感谢您的回复。但它不会在任何一种情况下都排除该领域吗?如果值为 null 或字段本身不存在,则这两种情况下都会排除该字段
    • @NOT_FOUND 我已经更新了答案。希望对你有帮助。
    • 这是一个很好的建议@Code_Mode,但这样做会完全弄乱复杂请求正文的请求验证。
    【解决方案2】:

    在您的模型/Dto 中的 operatorName 上方添加 @NotNull

    【讨论】:

      猜你喜欢
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 2014-12-15
      • 2021-07-23
      • 2012-10-16
      相关资源
      最近更新 更多