@RequestBody 如何区分未发送的值和空值?

问题描述 投票:0回答:2
@PatchMapping("/update")
HttpEntity<String> updateOnlyIfFieldIsPresent(@RequestBody Person person) {
    if(person.name!=null) //here
}

如何区分未发送的值和空值?如何检测客户端是否发送空字段或跳过字段?

java json spring spring-mvc jackson
2个回答
6
投票

上述解决方案需要对方法签名进行一些更改,以克服请求正文自动转换为 POJO(即 Person 对象)的问题。

方法一:-

您可以接收作为 Map 的对象并检查键“name”是否存在,而不是将请求正文转换为 POJO 类(Person)。

@PatchMapping("/update")
public String updateOnlyIfFieldIsPresent1(@RequestBody Map<String, Object> requestBody) {

    if (requestBody.get("name") != null) {
        return "Success" + requestBody.get("name"); 
    } else {
        return "Success" + "name attribute not present in request body";    
    }


}

方法2:-

接收字符串形式的请求正文并检查字符序列(即名称)。

@PatchMapping("/update")
public String updateOnlyIfFieldIsPresent(@RequestBody String requestString) throws JsonParseException, JsonMappingException, IOException {

    if (requestString.contains("\"name\"")) {
        ObjectMapper mapper = new ObjectMapper();
        Person person = mapper.readValue(requestString, Person.class);
        return "Success -" + person.getName();
    } else {
        return "Success - " + "name attribute not present in request body"; 
    }

}

0
投票

我知道这是一个老问题,但这是我发现的: 将其作为 json 字符串输入:

@PatchMapping("/update")
public String updateOnlyIfFieldIsPresent(@RequestBody String json)

然后在方法内部,将其反序列化两次。一旦进入你的班级,例如人,然后进入地图。 像这样的东西:

Person person = mapper.readValue(json, Person.class);
Set<String> fieldsExplicitlySet = mapper.readValue(json, new TypeReference<Map<String, Object>>(){}).keySet();
© www.soinside.com 2019 - 2024. All rights reserved.