Отображение Spring с использованием пользовательского метода сопоставления

#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 .