首页 > 解决方案 > Mapstruct映射嵌套类问题

问题描述

我的映射定义有问题。我希望你能给我一个提示如何解决它。我最初的情况是,我有嵌套类的类。输入嵌套类的大部分属性可以直接映射到目标嵌套类。但是输入嵌套类的一个属性必须直接映射到目标类。

这是我的代码:

public class Input {

    public String aa;
    public NestedClass nestedMember;
    
    public static class NestedClass {
        public String ab;
        public String ac;
        public String ad;
        public String ae;
    }
}

public class Target {

    public NestedClass nestedMember;
    
    public static class NestedClass {
        public String ba;
        public String bb;
        public String bc;
        public String bd;
    }
}

    @Mapping(target = "nestedMember.ba", source = "aa")
    @Mapping(target = "nestedMember", source = "nestedMember")
    Target map(Input input);
    
    @Mapping(target = "bb", source = "ab")
    @Mapping(target = "bc", source = "ac")
    @Mapping(target = "bd", source = "ad")
    @Mapping(target = "ba", ignore = true)
    NestedClass mappingNested(test.Input.NestedClass nestedClass);

我的假设是,mapstruct 将使用 mappingNested 方法映射嵌套类,然后将 aa 的直接属性映射到 nestedMember.ba。

但是生成的类看起来像这样:

public class MyMapperImpl implements MyMapper {

    @Override
    public Target map(Input input) {
        if ( input == null ) {
            return null;
        }

        Target target = new Target();

        if ( input.nestedMember != null ) {
            if ( target.nestedMember == null ) {
                target.nestedMember = new NestedClass();
            }
            nestedClassToNestedClass( input.nestedMember, target.nestedMember );
        }
        if ( target.nestedMember == null ) {
            target.nestedMember = new NestedClass();
        }
        inputToNestedClass( input, target.nestedMember );

        return target;
    }

    @Override
    public NestedClass mappingNested(test.Input.NestedClass nestedClass) {
        if ( nestedClass == null ) {
            return null;
        }

        NestedClass nestedClass1 = new NestedClass();

        nestedClass1.bb = nestedClass.ab;
        nestedClass1.bc = nestedClass.ac;
        nestedClass1.bd = nestedClass.ad;

        return nestedClass1;
    }

    protected void nestedClassToNestedClass(test.Input.NestedClass nestedClass, NestedClass mappingTarget) {
        if ( nestedClass == null ) {
            return;
        }
    }

    protected void inputToNestedClass(Input input, NestedClass mappingTarget) {
        if ( input == null ) {
            return;
        }

        mappingTarget.ba = input.aa;
    }
}

所以 mapstruct 正确地生成了 mappingNested 方法,但不使用它来映射nestedClasses。Mapstuct 生成一个没有任何映射的方法(nestedClassToNestedClass)。如果我删除显式 aa 映射,一切正常。但是我有一个问题,我应该如何映射 aa 映射?我不打算在 map 方法中映射 nestedClass 的每个属性。有人有想法吗?此致。

标签: javamapstruct

解决方案


我找到了一个解决方案:

@Mapping(target = "nestedMember", source = ".")
    Target map(Input input);
    
    @Mapping(target = "bb", source = "nestedClass.ab")
    @Mapping(target = "bc", source = "nestedClass.ac")
    @Mapping(target = "bd", source = "nestedClass.ad")
    @Mapping(target = "ba", ignore = true)
    NestedClass mappingNested(test.Input.NestedClass nestedClass);
    
    
    default NestedClass mappingNested(Input input) {
        NestedClass nestedClass = mappingNested(input.nestedMember);
        nestedClass.ba = input.aa;
        return nestedClass;
    }

推荐阅读