Сопоставьте перевернутый объект с помощью Mapstruct

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

Мои объекты такие:

public class A {
    private String name;
    private AChild child;
}
public class AChild {
    private String name;
    private AChild child;
}

public class B {
    private String name;
    private BParent parent;
}
public class BParent {
    private String name;
    private BParent parent;
}

у нас был бы такой A:

A : {
    name: "grandpa",
    child: {
        name: "dad",
        child: {
            name: "me",
        }
    }
}

и мы хотели бы это B:

B: {
    name: "me",
    parent: {
        name: "dad",
        parent: {
            name: "grandpa"
        }
    }
}

мы могли бы иметь бесконечную рекурсию

Заранее спасибо 😁

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Изменение порядка дерева, похоже, не имеет очевидного решения в MapStruct. Один из вариантов — использовать MapStruct для простых частей сопоставления (в данном случае «имя») и использовать пользовательский метод сопоставления для изменения порядка:

@Mapper
public interface AToBMapper {
    @Mapping(target = "parent", ignore = true)
    BParent parentNameOnly(A a);

    @Mapping(target = "parent", ignore = true)
    BParent parentNameOnly(AChild a);

    B parentToB(BParent b);

    default B aToB(A a) {
        List<BParent> list = new ArrayList<>();
        list.add(parentNameOnly(a));
        for (AChild child = a.child; child != null; child = child.child) {
            list.add(parentNameOnly(child));
        }
        Collections.reverse(list);
        BParent current = list.get(0);
        for (BParent next : list.subList(1, list.size())) {
            current.parent = next;
            current = next;
        }
        return parentToB(list.get(0));
    }
}
// Assuming A & AChild each have a (String name, AChild child) constructor

A a = new A("grandpa", new AChild("dad", new AChild("me", null)));
B b = Mappers.getMapper(AToBMapper.class).aToB(a);

Другие вопросы по теме