Я ничего не нашел об этом, я пытался изменить объект с помощью 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"
}
}
}
мы могли бы иметь бесконечную рекурсию
Заранее спасибо 😁
Изменение порядка дерева, похоже, не имеет очевидного решения в 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);