从 String 转换为 LocalDate 的 Modelmapper
Modelmapper to convert from String to LocalDate
我的 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);
}
};
....
}
我对modelmapper不是很熟悉。任何帮助是极大的赞赏。
按照建议,我尝试使用 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"。
如果你想转换成LocalDate
你需要创建一个Provider
否则ModelMapper
不能实例化LocalDate
因为它没有public 默认构造函数。
使用这个配置,它将起作用:
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
我目前正在使用 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();
我的项目也使用了 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());
希望对您有所帮助
我的 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);
}
};
....
}
我对modelmapper不是很熟悉。任何帮助是极大的赞赏。
按照建议,我尝试使用 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"。
如果你想转换成LocalDate
你需要创建一个Provider
否则ModelMapper
不能实例化LocalDate
因为它没有public 默认构造函数。
使用这个配置,它将起作用:
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
我目前正在使用 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();
我的项目也使用了 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());
希望对您有所帮助