如何使用 Dozer 或 ModelMapper 将 LocalDate 映射到 Date?
How to map LocalDate to Date using Dozer or ModelMapper?
如何正确设置 Dozer 6.4.1 或 ModelMapper 2.2.0 的映射以成功将 java.time.LocalDate
字段映射到 java.util.Date
字段,反之亦然?
考虑这些 class:
public class Foo {
private LocalDate signatureDate;
// getters and setters
}
public class Bar {
private Date signatureDate;
// getters and setters
}
然后调用 mapper.map(fooInstance, Bar.class);
将不起作用。
我试过创建和注册自定义转换器。使用 Dozer,我创建了扩展 DozerConverter<LocalDate, Date>
的 class LocalDateToDateConverter
并实现了正确的转换。然后这样注册:
mapper = DozerBeanMapperBuilder
.create()
.withCustomConverter(new LocalDateToDateConverter())
.build();
但在转换 class 时使用 com.github.dozermapper.core.converters.DateConverter
。
另外值得注意的是,我想要一个适用于所有可能需要这种类型转换的 class 的通用解决方案,这样我就不必为每个 class 制作转换器。
使用模型映射器,您可以在 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
时请注意时区。
如何正确设置 Dozer 6.4.1 或 ModelMapper 2.2.0 的映射以成功将 java.time.LocalDate
字段映射到 java.util.Date
字段,反之亦然?
考虑这些 class:
public class Foo {
private LocalDate signatureDate;
// getters and setters
}
public class Bar {
private Date signatureDate;
// getters and setters
}
然后调用 mapper.map(fooInstance, Bar.class);
将不起作用。
我试过创建和注册自定义转换器。使用 Dozer,我创建了扩展 DozerConverter<LocalDate, Date>
的 class LocalDateToDateConverter
并实现了正确的转换。然后这样注册:
mapper = DozerBeanMapperBuilder
.create()
.withCustomConverter(new LocalDateToDateConverter())
.build();
但在转换 class 时使用 com.github.dozermapper.core.converters.DateConverter
。
另外值得注意的是,我想要一个适用于所有可能需要这种类型转换的 class 的通用解决方案,这样我就不必为每个 class 制作转换器。
使用模型映射器,您可以在 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
时请注意时区。