【问题标题】:Modelmapper to convert from String to LocalDateModelmapper 从 String 转换为 LocalDate
【发布时间】:2016-09-12 16:05:22
【问题描述】:

我的 DTO 有字符串格式的日期字段。我的实体的日期为 LocalDate。目前我正在从地图中跳过它,然后手动显式设置它(字符串到日期,反之亦然)。

可以自动转换吗?我在spring bean中尝试了Converter,但它给了我很多编译错误(类型Converter不接受参数,不覆盖convert方法——convert()也有很多错误)。

@Bean
public ModelMapper studentModelMapper() {
....    
    Converter<String, LocalDate> toStringDate = new AbstractConverter<String, LocalDate>() {
        protected String convert(String source) {
            return source == null ? null : new LocalDate(source);
        }
    };
....
}

我对模型映射器不是很熟悉。任何帮助是极大的赞赏。

正如建议的那样,我尝试使用 LocalDate 进行 DTO,但问题是当我在前面发送此实体(REST 调用)时,我得到以下 JSON。

"dateOfBirth": {
   "year": 1972,
   "month": "JANUARY",
   "monthValue": 1,
   "dayOfMonth": 4,
   "dayOfWeek": "TUESDAY",
   "era": "CE",
   "dayOfYear": 4,
   "leapYear": true,
   "chronology": {
      "id": "ISO",
      "calendarType": "iso8601"
   }
}

我的前端开发人员需要“YYYY-MM-DD”。

【问题讨论】:

  • 为什么不在 DTO 中使用 LocalDate?

标签: spring modelmapper


【解决方案1】:

如果要转换为LocalDate,则需要创建Provider,否则ModelMapper无法实例化LocalDate,因为它没有公共默认构造函数。

使用此配置,它将起作用:

 ModelMapper modelmapper = new ModelMapper();

    Provider<LocalDate> localDateProvider = new AbstractProvider<LocalDate>() {
        @Override
        public LocalDate get() {
            return LocalDate.now();
        }
    };

    Converter<String, LocalDate> toStringDate = new AbstractConverter<String, LocalDate>() {
        @Override
        protected LocalDate convert(String source) {
            DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd");
            LocalDate localDate = LocalDate.parse(source, format);
            return localDate;
        }
    };


    modelmapper.createTypeMap(String.class, LocalDate.class);
    modelmapper.addConverter(toStringDate);
    modelmapper.getTypeMap(String.class, LocalDate.class).setProvider(localDateProvider);

测试输出:

 String dateTest = "2000-09-27";
 LocalDate dateConverted = modelmapper.map(dateTest, LocalDate.class);

 System.out.println(dateConverted.toString()); //Output = 2000-09-27

【讨论】:

    【解决方案2】:

    我还在我的项目中使用了 ModelMapper 2.3.5,并且遇到了类似的问题。 ModelMapper相关项目https://github.com/modelmapper/modelmapper-module-java8/的使用对我帮助很大。

    它提供了两个模块,一个可以通过向您的项目提供以下 maven 依赖项来添加到 ModelMapper 配置中:

    <!-- https://mvnrepository.com/artifact/com.github.chhsiao90/modelmapper-module-java8-datatypes -->
    <dependency>
        <groupId>com.github.chhsiao90</groupId>
        <artifactId>modelmapper-module-java8-datatypes</artifactId>
        <version>1.1.0</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/com.github.chhsiao90/modelmapper-module-jsr310 -->
    <dependency>
        <groupId>com.github.chhsiao90</groupId>
        <artifactId>modelmapper-module-jsr310</artifactId>
        <version>1.1.0</version>
    </dependency>
    

    那么ModelMapper配置应该添加

    modelMapper.registerModule(new Jsr310Module());
    modelMapper.registerModule(new Jdk8Module());
    

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      我目前正在使用 ModelMapper 2.3.5,当我为我的映射执行 ModelMapper.validate() 时,接受的解决方案不适用于我。见my related question

      我设法让验证工作 - 令人惊讶的是 - 通过完全删除提供者所以只使用转换器。比如:

      modelmapper.addConverter(toStringDate);
      modelmapper.getTypeMap(String.class, LocalDate.class); // no provider, maps ok with me still
      modelmapper.validate();
      

      【讨论】:

        猜你喜欢
        • 2019-01-08
        • 1970-01-01
        • 2019-02-15
        • 1970-01-01
        • 2011-07-25
        • 1970-01-01
        • 2019-07-22
        • 1970-01-01
        相关资源
        最近更新 更多