Ошибка MapStruct при рекурсивном отображении - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь реализовать библиотеку картографирования MapStruct. Я сделал сэмплы и для простого картирования он работает нормально, но я застрял в 1 выпуске. У меня есть 2 класса сущностей jpa, которые имеют двусторонние отношения. Один в другом, а другой в одном. Это создает проблему циклического отображения, поэтому MapStruct генерирует ошибку StackOverflow. Я создал минимальный код для воспроизведения случая на github . Пример кода:

public class A {
    private Long id;
    private String name;
    private B bData;
    //getter-setter
}

public class B {
    private Long id;
    private String name;
    private Set<A> aData;
    //getter-setter
}

Генератор данных

public class DataGenerator {
    public static A generateData(){
        A a = new A();
        a.setId(1L);
        a.setName("foo");
        B b = new B();
        b.setId(2L);
        b.setName("bar");

        A a2 = new A();
        a2.setId(3L);
        a2.setName("john");
        a2.setbData(b);
        A a3 = new A();
        a3.setId(4L);
        a3.setName("doe");
        a3.setbData(b);

        Set<A> aData = new HashSet<A>();
        aData.add(a2);
        aData.add(a3);
        b.setaData(aData);

        a.setbData(b);
        return a;
    }
}

Mapper

@Mapper
public interface CustomMapper {
    CustomMapper INSTANCE = Mappers.getMapper(CustomMapper.class);
    ADto atoADto(A a);
}

Приложение

public class AppMain {
    public static void main(String[] args) {
        A a = DataGenerator.generateData();
        ADto aDto = CustomMapper.INSTANCE.atoADto(a);
        System.out.println(aDto.getId());
    }
}

Классы Dto / Destination такие же, как классы исходного кода. Основным является проблема циклического / рекурсивного сопоставления, которая вызывает ошибку переполнения стека.

То же самое работает с spring BeanUtils.copyProperties , но я хочу реализовать MapStruct. В настоящее время я думаю заменить пружину BeanUtils на MapStruct .

какие-либо предложения?

1 Ответ

1 голос
/ 10 ноября 2019

Есть пример здесь в репозитории MapStruct, как работать с циклами и рекурсией. В основном вам нужно следить за состоянием. В этом примере для этого используется объект контекста.

...