Список сопоставления объекта из родительского объекта, у которого есть список объектов

Я пытаюсь использовать mapstruct для преобразования объекта, как показано ниже

Источник

MainObject
{

    String key;
    List<ChildObject> children;
}

ChildObject{

    String childVar1;
    String childVar2;

}

Цель

List<TargetObj> targetObjects;

TargetObj{

    String key;
    String var1;
    String var2;

}

Мне нужно подготовить список экземпляров TargetObj с ключом, сопоставленным с ключом из MainObject, и var1 и var2, сопоставленным из ChildObject. Я попытался использовать ObjectFactory и Decorator, как указано в документации mapstruct. Но не мог найти способ сделать это. В обоих случаях я получил ошибку, в которой состояния не могут возвращать итерируемый объект из не повторяемых параметров.


person nprak    schedule 23.06.2018    source источник


Ответы (1)


Вы можете попробовать использовать комбинацию @BeforeMapping или @AfterMapping с @Context.

Ваш картограф может выглядеть так:

@Mapper
public interface MyMapper {

    default List<TargetObj> map(MainObject source) {
        if (source == null) {
            return Collections.emptyList(); // or null or whatever you prefer 
        }
        return map(source.getChildren(), new CustomContext(source));
    }

    List<TargetObject> map(List<ChildObject> children, @Context CustomContext context);

    @Mapping(target = "key", ignore = true) // key is mapped in the context
    TargetObject map(ChildObject child, @Context CustomContext context);
}

И настраиваемый контекст будет выглядеть примерно так:

public class CustomContext {

    protected final MainObject mainObject;

    public CustomContext(MainObject mainObject) {
        this.mainObject = mainObject;
    }

    @AfterMapping // of @BeforeMapping
    public void afterChild(@MappingTarget ChildObject child) {
        child.setKey(mainObject.getKey());
        // More complex mappings if needed
    }
}

Цель состоит в том, чтобы вручную отобразить ваш MainObject в List<TargetObj>, используя другие методы, которые MapStruct сгенерирует.

person Filip    schedule 23.06.2018