Modelmapper для преобразования из String в LocalDate
У моего DTO есть поле даты в формате String. Моя сущность имеет дату как LocalDate. В настоящее время я пропускаю его с карты, а затем вручную устанавливаю его вручную (String to Date и наоборот).
Возможно ли конвертировать его автоматически? Я пробовал Converter внутри Spring Bean, но он дает мне много ошибок компиляции (тип 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);
}
};
....
}
Я не очень знаком с модельером. Любая помощь с благодарностью.
Как и предполагалось, я пытался использовать 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"
}
}
Моему разработчику внешнего интерфейса нужно "ГГГГ-ММ-ДД".
1 ответ
If you want to convert to LocalDate
вам нужно создать Provider
иначе ModelMapper
cannot instantiate LocalDate
because it doesn't have a public default constructor.
Use this configuration and it will work:
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 проекта https://github.com/modelmapper/modelmapper-module-java8/.
Он предоставляет два модуля, которые можно добавить в конфигурацию ModelMapper, предоставив вашему проекту следующие зависимости maven:
<!-- 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());
Надеюсь, это поможет
В настоящее время я использую ModelMapper 2.3.5, и принятое решение не работает со мной, когда я использую ModelMapper.validate()
для моего отображения. См. Мой связанный с этим вопрос.
Удивительно, но мне удалось заставить работать валидацию, полностью удалив провайдера, поэтому используется только конвертер. Так нравится:
modelmapper.addConverter(toStringDate);
modelmapper.getTypeMap(String.class, LocalDate.class); // no provider, maps ok with me still
modelmapper.validate();