MapStruct对象继承映射

时间:2020-08-31 10:06:11

标签: java mapstruct

我有一个给定的情况,如下所示

> class Curve {
      private List<Point> points = new ArrayList<>();
  }

> class Points {
      private Axis xAxis;
      private Axis yAxis;
      private Axis zAxis;
   }

> abstract class Axis {}

> class XAxis extends Axis {}
> class YAxis extends Axis {}
> class ZAxis extends Axis {}

我正在为Curve类创建一个Mapper:

@Mapper
public interface CurveMapper {

 CurveMapper INSTANCE = Mappers.getMappers(CurveMapper.class);
 
 com.entity.Curve map(com.dto.Curve dtoCurve);    

}

构建失败,要求提供Axis的具体类/对象工厂 课。

我可以为Axis类添加objectFactory,但是如何通过单个objectFactory映射所有3种不同的具体类。

1 个答案:

答案 0 :(得分:0)

最简单的解决方案显然是在类上使用具体类型:

> class Curve {
      private List<Point> points = new ArrayList<>();
  }

> class Points {
      private XAxis xAxis;
      private YAxis  yAxis;
      private ZAxis zAxis;
   }

> abstract class Axis {}

> class XAxis extends Axis{}
> class YAxis extends Axis{}
> class ZAxis extends Axis{}

否则,您应该看看qualifiers

定义以下类别:

public class AxisMapper {

    public Axis xAxis(AxisDto dto) {
        // some mapping logic, including new object creation
    }

}

定义用于常规轴处理的限定符:

import org.mapstruct.Qualifier;

@Qualifier
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface AxisTranslator{
}

以及方法的限定符(每轴一个):

import org.mapstruct.Qualifier;

@Qualifier
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface XAxis{
}

装饰您的自定义映射器:

@AxisTranslator
public class AxisMapper {

    @XAxis
    public Axis xAxis(AxisDto dto) {
        // some mapping logic, including new object creation
    }

}

然后,将此新的映射器添加到您的映射器中:

@Mapper(uses = AxisMapper.class)
public interface CurveMapper {

 CurveMapper INSTANCE = Mappers.getMappers(CurveMapper.class);
 
 @Mapping( target = "xAxis", qualifiedBy = { AxisTranslator.class, XAxis.class } )
 com.entity.Curve map(com.dto.Curve dtoCurve);    

}

对Y和Z轴执行相同操作。