猿问

Spring REST API 为 pojo 注册日期转换器

Spring Rest默认提供从路径变量和url参数构建pojo的功能。


就我而言,我有 pojo:


public class MyCriteria {

  private String from;

  private String till;

  private Long communityNumber;

  private String communityName;

}

这是我的控制器中使用的。网址是http://localhost:8080/community/{communityNumber}/app. 请求结果


curl "http://localhost:8080/community/1/app?from=2018-11-14&till=2019-05-13&communityName=myCOm"

是:


{

  'from':'2018-11-14';

  'till':'2019-05-12';

  'communityNumber':'1';

  'communityName':'myCOm'

}

看起来效果很好。在 pojo 数据中包含按用途所需的类型会更好。所以我想要有字段from和till类型LocalDate。使用 spring 我希望这个解决方案几乎是开箱即用的。但由于生命周期,任何弹簧或杰克逊日期转换器都无法解决我的问题。


Spring 在注入日期之前验证 pojo 字段的类型,并且我得到类型不匹配异常。我认为一般原因是 spring 使用特殊的构建器,它尝试按名称查找所需的参数,并且忽略要在 pojo 内部应用的字段的注释。


问题是:

是否有任何优雅的解决方案可以通过 spring 构建 pojo,其中某些字段默认会转换为String格式?LocalDate


守着星空守着你
浏览 187回答 4
4回答

ABOUTYOU

这可能对你有帮助。我有类似的情况,我使用这种方法将数据转换为特定的需求。public class MyCriteria {  public MyCriteria(LocalDate from, LocalDate till, Long communityNumber, String communityName){   // assignement of variables}  private LocalDate from;  private LocalDate till;  private Long communityNumber;  private String communityName;}因此,每当您从 JSON 创建对象时,它都会根据要求创建它。当我实现这个时,我使用“Jackson”的 ObjectMapper 类来完成此操作。希望你也能使用同样的方法。

慕仙森

在 pojo 类中使用 java.sql.Date 。就像 private Date from 一样。我希望它能用于 JSON 转换。当您从 UI 接收日期 JSON 字段时,请始终使用 Java.sql.Date 进行 Jackson 日期转换。

弑天下

问题的答案是使用 init binder 来注册指定条件内的类型映射。需要PropertyEditorSupport针对特定目的进行实施。短代码示例是:    @InitBinder    public void initBinder(WebDataBinder binder) {        binder.registerCustomEditor(LocalDate.class, new PropertyEditorSupport() {            @Override            public void setAsText(String text) throws IllegalArgumentException {                setValue(LocalDate.parse(text, DateTimeFormatter.ISO_LOCAL_DATE));            }        });    }完整的代码示例可以从github获取:import lombok.extern.slf4j.Slf4j;import org.springframework.web.bind.WebDataBinder;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.InitBinder;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import org.vl.example.rest.dtofromoaramsandpath.web.dto.MyCriteriaLd;import java.beans.PropertyEditorSupport;import java.time.LocalDate;import java.time.format.DateTimeFormatter;@RestController@RequestMapping("verify/criteria/mapping")@Slf4jpublic class MyControllerLd {    @InitBinder    public void initBinder(WebDataBinder binder) {        binder.registerCustomEditor(LocalDate.class, new PropertyEditorSupport() {            @Override            public void setAsText(String text) throws IllegalArgumentException {                setValue(LocalDate.parse(text, DateTimeFormatter.ISO_LOCAL_DATE));            }        });    }    @GetMapping("community/{communityNumber}/dtold")    public MyCriteriaLd loadDataByDto(MyCriteriaLd criteria) {        log.info("received criteria: {}", criteria);        return criteria;    }}因此,这种情况的模型可以是下一个:import lombok.Data;import java.time.LocalDate;@Datapublic class MyCriteriaLd {    private LocalDate from;    private LocalDate till;    private Long communityNumber;    private String communityName;}

30秒到达战场

为此,您需要添加jsr310依赖项。compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.8.10")我希望这对你有用。
随时随地看视频慕课网APP

相关分类

Java
我要回答