Я пытаюсь решить проблему с Mapstruct. У меня есть запись
A, которая реализует интерфейс
B, который сам расширяет другой интерфейс. Идея состоит в том, что
B соответствует методу получения свойства
A, а
B сам по себе является конкретным типом более общего свойства.< /p>
(Карточка здесь — интерфейс)
Код: Выделить всё
public interface B extends C {
CardM card();
}
(CardM — это карта, реализующая запись)
Код: Выделить всё
public record A(
CardM card
) implements B {}
В моем классе сопоставителей я определил 2 сопоставителя: один для сопоставления
A с другим классом (
BO) и сопоставитель для сопоставления
CardM к аналогичному объекту в
BO . Итак, у меня есть один класс, содержащий эти два метода:
Код: Выделить всё
@BeanMapping(ignoreByDefault = true)
@Mapping(target = "card", source = "card")
public abstract BO mapBo(A request);
и
Код: Выделить всё
@BeanMapping(ignoreByDefault = true)
@Mapping()
protected abstract Card mapCard(CardM card);
Я ожидал, что когда Mapstruct сгенерирует преобразователи, MapBo будет использовать MapCard для сопоставления
CardM с
Card BO . Вместо этого он генерирует новый метод, сопоставляющий верхний интерфейс C с Card, и использует его:
Код: Выделить всё
@Override
public BO mapBo(A request) {
if ( request == null ) {
return null;
}
BO bo = new BO();
bo .setCard( cardToCard( request.card() ) );
}
protected Card cardToCard(C card) {
if ( card == null ) {
return null;
}
Card card1 = new Card();
return card1;
}
Я пытался использовать квалифицированныйBy="name", чтобы принудительно использовать мою карту MapCard, и я знаю, что могу решить проблему, используя выражение "java(mapCard(...) )", но у меня вопрос: почему Mapstruct не использует мой картограф автоматически?
request.card() возвращает не
C, а
CardM, и подписи совпадают. Похоже, это проблема с дженериками и иерархией.
Я решил проблему, принудив вызов как таковой:
Код: Выделить всё
@Mapping(target = "card", expression = "java(mapCard(request.card()))")
но, кроме использования моего картографа напрямую с параметром выражения, есть ли другой способ решить эту проблему (использование квалифицированного по имени не работает, я пробовал)?
Подробнее здесь:
https://stackoverflow.com/questions/788 ... d-generics