如何正确设置Dozer 6.4.1或ModelMapper 2.2.0到成功将java.time.LocalDate
字段映射到java.util.Date
字段的映射,反之亦然?
考虑以下类:
public class Foo {
private LocalDate signatureDate;
// getters and setters
}
public class Bar {
private Date signatureDate;
// getters and setters
}
然后致电mapper.map(fooInstance, Bar.class);
无效。
我尝试创建和注册自定义转换器。使用推土机,我创建了扩展LocalDateToDateConverter
的类DozerConverter<LocalDate, Date>
并实现了正确的转换。然后像这样注册它:
mapper = DozerBeanMapperBuilder
.create()
.withCustomConverter(new LocalDateToDateConverter())
.build();
但是在转换类时使用com.github.dozermapper.core.converters.DateConverter
。
另外值得注意的是,我希望为所有可能需要这种类型转换的类提供一个通用的解决方案,这样我就不必为每个类都建立转换器。
答案 0 :(得分:1)
使用模型映射器,您可以为Date
和LocalDate
类在Bar
和Foo
之间配置converters。
转换器:
private static final Converter<Date, LocalDate> DATE_TO_LOCAL_DATE_CONVERTER = mappingContext -> {
Date source = mappingContext.getSource();
return source.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
};
private static final Converter<LocalDate, Date> LOCAL_DATE_TO_DATE_CONVERTER = mappingContext -> {
LocalDate source = mappingContext.getSource();
return Date.from(source.atStartOfDay(ZoneId.systemDefault()).toInstant());
};
映射器配置:
ModelMapper mapper = new ModelMapper();
TypeMap<Bar, Foo> barToFooMapping = mapper.createTypeMap(Bar.class, Foo.class);
barToFooMapping.addMappings(mapping -> mapping.using(DATE_TO_LOCAL_DATE_CONVERTER).map(Bar::getSignatureDate, Foo::setSignatureDate));
TypeMap<Foo, Bar> fooToBarMapping = mapper.createTypeMap(Foo.class, Bar.class);
fooToBarMapping.addMappings(mapping -> mapping.using(LOCAL_DATE_TO_DATE_CONVERTER).map(Foo::getSignatureDate, Bar::setSignatureDate));
在将Date
转换为LocalDate
并将LocalDate
转换为Date
时,请注意时区。