有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Mapstruct报告策略不适用于嵌套属性

我在项目中使用mapstruct进行模型映射。为了确保在映射程序中处理每个目标属性,我使用unappedTargetPolicy=Error

我的问题是,我的模型中有嵌套类,我需要确保嵌套类的每个属性也被映射

我发现了以下几件事:

  1. 如果我没有映射任何嵌套类(没有属性,也没有嵌套类本身),我会得到预期的编译错误-->;嗯
  2. 如果我为嵌套类定义了显式映射,则会得到嵌套类的每个未映射属性的预期编译错误-->;嗯
  3. 但是,如果在基类的映射定义中映射嵌套类的至少一个属性,则不会得到错误-->;不适合我(例如@Mapping(source=“abc”,target=“memberOfNestedClassType.abc”)

我如何确保在映射中,即使不对嵌套类使用显式映射器,也能处理每个目标属性

或者这可能是mapstruct中的一个bug

谢谢你的帮助

CodeExample(对于案例3.NestedMember.b未映射):

// Target Class
    package test;

public class Target {

    public String x;
    public String y;
    public NestedClass nestedMember;
    
    public static class NestedClass {
        public String a;
        public String b;
    }
}

// Source class
package test;

public class Input {

    public String source;
}

// Mapping
package test;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.ReportingPolicy;

@Mapper(unmappedSourcePolicy = ReportingPolicy.WARN, unmappedTargetPolicy = ReportingPolicy.ERROR)
public interface MyMapper {

    @Mapping(target = "x", constant = " ")
    @Mapping(target = "y", constant = " ")
    @Mapping(target = "nestedMember.a", source = "source")
    Target map(Input input);
}

//生成的Impl

package test;

import javax.annotation.Generated;
import test.Target.NestedClass;

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2021-05-18T09:22:27+0200",
    comments = "version: 1.4.2.Final, compiler: Eclipse JDT (IDE) 1.3.1200.v20200916-0645, environment: Java 11.0.10 (AdoptOpenJDK)"
)
public class MyMapperImpl implements MyMapper {

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

        Target target = new Target();

        target.nestedMember = inputToNestedClass( input );

        target.x = " ";
        target.y = " ";

        return target;
    }

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

        NestedClass nestedClass = new NestedClass();

        nestedClass.a = input.source;

        return nestedClass;
    }
}

共 (0) 个答案