#java #mapstruct
#java #mapstruct
Вопрос:
У меня есть два объекта со всеми одинаковыми элементами, за исключением элемента date. В Obj1.date — это java.sql.Date, а Obj2.date — это long (эпоха).
Мне нужно написать mapper для сопоставления obj1 с obj2. Это то, что я пытался сделать:
@Named("sqlDateToEpoch")
default long sqlDateToEpoch(Date timestamp) throws ParseException {
return myUtils.sqlDateToEpoch(timestamp);
}
@Mapping(source = "date", target = "date", qualifiedByName = "sqlDateToEpoch")
Obj2 toObj2(Obj1 source);
List<Obj2> toRecordList(List<Obj1> source);
Но mapperImpl просто имеет свою собственную реализацию для преобразования даты:
if (source.getDate() != null) {
Obj2.setDate(Long.parseLong(source.getDate()));
}
Я получаю:
java.lang.NumberFormatException: For input string: "2019-04-02 00:00:00.0"
Каков правильный способ для такого преобразования?
Комментарии:
1. Ваш код работает. Я воспроизводю вашу ошибку, если date в Obj1 является строкой, а не java.sql.Date.
2. попробуйте текущий мастер.. Совсем недавно были решены некоторые проблемы в квалификаторах. Все еще необходимо добавить приличное сообщение об ошибке при отсутствии методов-определителей.
Ответ №1:
Я думаю, что причина, по которой это не работает, заключается в том, что вы source.getDate()
возвращаете a String
, а не a java.sql.Date
. Это приводит к MapStruct, использующему неявное преобразование String
в long
.
Чтобы исправить это, вам нужно либо убедиться, что это source.getDate()
возвращает java.sql.Date
, либо добавить метод, который получал бы String
и возвращал Long
.