当前位置: 首页 > 知识库问答 >
问题:

要从字符串转换为LocalDate的Modelmapper

逄皓轩
2023-03-14

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

可以自动转换吗?我尝试在Springbean中使用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);
        }
    };
....
}

我对modelmapper不是很熟悉。非常感谢您的帮助。

正如我建议的那样,我尝试使用LocalDate for 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”。

共有3个答案

赏新知
2023-03-14

我目前正在使用ModelMapper 2.3.5,当我使用ModelMapper时,接受的解决方案不适用于我。为我的映射验证()。见我的相关问题。

令人惊讶的是,我完全删除了提供程序,只使用了转换器,从而使验证工作正常。就像:

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

咸臻
2023-03-14

我也在我的项目中使用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());

希望这能有所帮助

拓拔弘厚
2023-03-14

如果要转换为LocalDate,则需要创建提供程序,否则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
 类似资料:
  • 我想将转换为,但由于某种原因无法转换。

  • 我使用Spring靴和Spring4。 我尝试使用Java 8 LocalDate。 在json中输入日期 出生日期:“1969-12-29” 在服务器端这个领域我有 我得到这个错误 组织。springframework。http。转换器。HttpMessageNoteableException:无法读取文档:无法从字符串值('1969-12-29')实例化类型为[简单类型,类java.time.

  • 我遇到了这样一个java字符串,其中以下内容是错误的: 我想这是因为字符串构造函数默认将主体字节[]的编码视为UTF-8,我不是100%确定。我如何能够将此字符串存储在字节[]中,并能够稍后将其转换回来?我想我需要能够确定字节[]的编码方式。我该怎么做呢? 一些上下文:我需要字节[],以便压缩数据,将其存储在数据库中,然后解压缩并将未压缩的字节[]转换回原始字符串。这个字符串最初来自某个下载了网页

  • 我得到这个错误,你能找到我做错了什么。 无法转换“java”类型的值。lang.String“”转换为所需的java类型。时间LocalDate的嵌套异常为java。lang.IllegalStateException:无法转换“java”类型的值。lang.String“to required type”java。时间LocalDate“:未找到匹配的编辑器或转换策略。

  • 问题内容: 在SQL 9(2005)中创建了一个存储过程,此后已升级到SQL 10(2008)。从那时起,以下存储过程停止工作并引发上述错误: 传入的参数@vPortalUID包含:2A66057D-F4E5-4E2B-B2F1-38C51A96D385。我执行这样的存储过程: 它跌倒了。我也尝试过转换。仍然没有喜悦。也具有将{}括起来的价值。我如上所述以编程方式和手动方式删除了这些内容。 如果您

  • 问题内容: 我试图将const char *传递给从Swift中的Swift字符串转换而来的旧C库。 这是我正在调用的C函数: 如何将Swift字符串转换为这种const char类型?当我像这样传递ipAddress时,它可以工作: 但是当我这样通过时dit不起作用 我在需要指定类型的函数中需要它: 我尝试使用AnyObject而不是String,但这也不起作用。 谢谢。 问题答案: 不知道为什