我正在创建一个从我的实体类到由开放标准 OSDM 设计的 API 资源类的 MapStruct 映射器,我必须遵守它的规范。
我有一个实体
Leg
具有鉴别器属性LegType type
.
然而,目标
TripLeg
类看起来像这样:
public class TripLeg {
private TimedLeg timedLeg;
private TransferLeg transferLeg;
public ContinuousLeg continuousLeg;
}
我的目标是根据
Leg.type
值填充其中一个字段。
但是,
@SubclassMapping
不带任何标识符字段或表达式。
我找到了唯一的解决方案来装饰 LegMapper 并编写基于鉴别器属性并选择三个腿子类映射器的自定义逻辑。
有没有一种声明式的方式来实现这一点?不需要相反方向的映射。
只有在发布问题并寻找更多相关答案后,我才找到解决方案。映射属性
conditionQualifiedByName
和命名条件方法是解决方案。
@Mapper
public interface LegMapper {
@Condition
@Named("TimedLeg")
default boolean isTimedLeg(Leg leg) {
return leg != null && leg.getLegType().equals("TransitLeg");
}
@Mapping(source = ".", target = "timedLeg", conditionQualifiedByName = "TimedLeg")
TripLeg toResource(Leg);
}