【问题标题】:Mapstruct Mapping nested classes issueMapstruct映射嵌套类问题
【发布时间】:2021-08-04 07:03:50
【问题描述】:

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

这是我的代码:

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 的每个属性。 有人有想法吗? 最好的问候。

【问题讨论】:

    标签: java mapstruct


    【解决方案1】:

    我找到了解决办法:

    @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;
        }
    

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 2020-11-16
      • 1970-01-01
      • 2018-09-15
      • 2019-07-13
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多