如何使用推土机或ModelMapper将LocalDate映射到Date?

时间:2018-09-18 13:22:36

标签: java dozer modelmapper

如何正确设置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

另外值得注意的是,我希望为所有可能需要这种类型转换的类提供一个通用的解决方案,这样我就不必为每个类都建立转换器。

1 个答案:

答案 0 :(得分:1)

使用模型映射器,您可以为DateLocalDate类在BarFoo之间配置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时,请注意时区。