我有一个给定的情况,如下所示
> 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种不同的具体类。
答案 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轴执行相同操作。