Обработка Mapstruct интерфейсов/родителей и дженериковJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Обработка Mapstruct интерфейсов/родителей и дженериков

Сообщение Anonymous »

Я пытаюсь решить проблему с Mapstruct. У меня есть запись A, которая реализует интерфейс B, который сам расширяет другой интерфейс. Идея состоит в том, что B соответствует методу получения свойства A, а B сам по себе является конкретным типом более общего свойства.< /p>

Код: Выделить всё

public interface C {
S card();
}
(Карточка здесь — интерфейс)

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»