Mapstruct: свойства списка карт с использованием квалифицированного IterableMapping - PullRequest
0 голосов
/ 02 апреля 2019

Сначала позвольте мне извиниться, если этот вопрос уже был задан. Я не смог найти ссылку в StackOverflow.

Я пытаюсь использовать квалификацию в моем отображении между bean-компонентами через MapStruct, чтобы преобразовывать списки с помощью квалифицированного отображения. Увы, безуспешно.

Предположим, у нас есть следующие классы (максимально упрощенные, и я опущу очевидные методы получения / установки):

public class A {
    private String propertyA;
}
public class B {
    private String propertyB;
    private A instanceA;
}
public class C {
    private List<B> instancesB;
}

public class A1 {
    private String propertyA;
}
public class B1 {
    private String propertyB;
    private A1 instanceA1;
}
public class C1 {
    private List<B1> instancesB1;
}

Предположим, у нас есть следующий классификатор:

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface Full{}

Предположим также, что имеются следующие отображения:

@Mapper
public interface MapperA {
    A1 toA1(A a);
    A toA(A1 a1);
}
@Mapper
public interface MapperB {
    B1 toB1(B b);
    @Mapping(source="propertyA", target="propertyA1")
    @Full
    B1 toB1Full(B b);
    @IterableMapping(qualifiedBy=Full.class)
    @Full
    List<B1> toB1s(List<B> bs);
    toB(B1 b);
    @Mapping(source="propertyA1", target="propertyA")
    @Full
    toBFull(B1 b);
    @IterableMapping(qualifiedBy=Full.class)
    @Full
    List<B> toBs(List<B1> bs);    
}
@Mapper
public interface MapperC {
    <HERE IS THE PROBLEM>
}

Как я могу написать Mapper C, чтобы использовать полное отображение для повторных экземпляров B?

Независимо от того, как я пытаюсь написать аннотации для сопоставления, например

@Mapping(source = "instancesB1", target="instancesB", qualifiedBy=Full.class)

Я всегда нахожусь с неполной сопоставленной сущностью: у экземпляра B1 есть правильно сопоставленное поле propertyB, но нет instanceA1.

Конечно, я могу просто написать MapperC как абстрактный класс, реализовать метод, вызвать вручную маппер и просто быть довольным этим, но я задаюсь вопросом, можно ли как-то просто аннотировать метод в MapperC и пусть Mapstruct автоматически использует для меня правильный метод отображения (поскольку это упрощенный случай, но я могу преобразовать десятки таких списков).

Спасибо за внимание.

1 Ответ

1 голос
/ 03 апреля 2019

Не уверен, что вы пробовали это, но, судя по примеру, кажется, что Mapper#uses отсутствует.

В вашем случае это должно выглядеть примерно так (без методов отображения):

@Mapper
public interface MapperA {

}

@Mapper(uses = MapperA.class)
public interface MapperB {

}

@Mapper(uses = MapperB.class)
public interface MapperC {

}

Когда вы используете Mapper#uses, MapStruct будет искать подходящие методы в классах, определенных в uses. Однако, если у вас его нет, MapStruct ничего не сможет сделать и сгенерирует отображение по умолчанию.

...