Как сопоставить LocalDate с датой, используя Dozer или ModelMapper? - PullRequest
0 голосов
/ 18 сентября 2018

Как правильно настроить отображение 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); не будет работать.

Я попытался создать и зарегистрировать пользовательские конвертеры.Используя Dozer, я создал класс LocalDateToDateConverter, который расширяет DozerConverter<LocalDate, Date> и реализовал правильное преобразование.Затем зарегистрируйте его следующим образом:

mapper = DozerBeanMapperBuilder
        .create()
        .withCustomConverter(new LocalDateToDateConverter())
        .build();

, но вместо преобразования * используется com.github.dozermapper.core.converters.DateConverter.

Также стоит отметить, что я хотел бы получить общее решение длявсе классы, которые могут нуждаться в этом преобразовании типов, так что мне не нужно делать конвертер для каждого класса.

1 Ответ

0 голосов
/ 18 сентября 2018

Используя модель mapper, вы можете настроить преобразователи между Date и LocalDate для Bar и Foo классов.

Преобразователи:

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());
};

Конфигурация Mapper:

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.

...