【问题标题】:Spring Boot @RequestBody bind null values to a default value?Spring Boot @RequestBody 将空值绑定到默认值?
【发布时间】:2020-11-10 19:57:15
【问题描述】:

我有一个使用自定义 POJO 类作为 POST 请求正文的 Spring Boot 服务。当客户端将其中一个字段作为 null 传递时,我希望将该值设置为 0。

@Data
public class CardAnswer {
    private Integer answerId = 0; //should always be 0 and never set to null
    private String value;
}

由以下控制器使用:

@RequestMapping(value = "/{category}", method = RequestMethod.POST)
    public SalesPulseMResponse updateSecurity(@PathVariable(value = SalesedgeConstants.CATEGORY)
                                              @RequestBody CardAnswer requestBody) {

        return fooService.updateFieldsByCategory(category, requestBody);
    }

Spring boot 将为我处理从 JSON 到 CardAnswer 的数据绑定,但是每当 answerId 作为 null 传递时,我希望它保留 0。有没有合适的方法来做到这一点,或者我必须这样做解析类并自己设置值?目前,如果客户端没有在他们的请求 JSON 中传入这个字段,它将保留默认值,但是,我希望即使对于传入的 null 值也保留该默认值。

【问题讨论】:

  • 没有好的现有机制。您可以使请求类实现一个Initializable 接口(或者您希望命名它)并调用request.initialize(),然后用默认值填充空值。这将是手工工作,但至少会是一致的设计。
  • 我考虑过使用原始方法,但我不确定它的含义,因为标准做法似乎是使用包装类。
  • 带有null 检查的自定义设置器应该可以解决问题,如果您可以忍受拒绝nulls 的非直观设置器(您可能需要使用@JsonProperty 让杰克逊选择它了,但我不确定,你必须检查)

标签: java spring spring-boot


【解决方案1】:

ints 有这个属性,所以:

@Data
public class CardAnswer {
    private int answerId;
    private String value;
}

例子:

@Data
public class CounterRequest {
    private final int int1;
    private final int int2;
}

@Data
public class CounterResult {
    private final int value;
}

@RestController
@RequestMapping(
        produces = MediaType.APPLICATION_JSON_UTF8_VALUE,
        consumes = MediaType.APPLICATION_JSON_VALUE)
public class CounterRestController {
    public static final String ADD_URL = "/counter/add";
    
    @RequestMapping(value = ADD_URL,
            method = RequestMethod.POST)
    public CounterResult add(@RequestBody @Valid
            CounterRequest counterRequest) {
        return new CounterResult(counterRequest.getInt1() + counterRequest.getInt2());
    }
}

运行:

$ curl -X POST -H "Content-Type: application/json"  --data "{\"int1\":null,\"int2\":2}" localhost:8080/counter/add
{"value":2}
$ curl -X POST -H "Content-Type: application/json"  --data "{\"int1\":1,\"int2\":2}" localhost:8080/counter/add
{"value":3}

【讨论】:

    【解决方案2】:

    您可以使用@JsonIgnore

    @Data
    public class CardAnswer {
        @JsonIgnore
        private Integer answerId = 0;
        private String value;
    }
    

    【讨论】:

    • @jsonIgnore Annotation 刚刚删除了该字段。
    猜你喜欢
    • 1970-01-01
    • 2018-10-07
    • 2017-11-10
    • 2016-05-06
    • 2016-03-06
    • 2015-04-11
    • 2019-02-21
    • 2013-12-26
    • 1970-01-01
    相关资源
    最近更新 更多