我正在创建一个MapStruct映射器,从我的实体类到由开放标准OSDM设计的API资源类,我必须遵守其规范。
我有一个具有鉴别符属性LegType type
的实体Leg
。
然而,目标TripLeg
类看起来像这样:
public class TripLeg {
private TimedLeg timedLeg;
private TransferLeg transferLeg;
public ContinuousLeg continuousLeg;
}
我的目标是根据Leg.type
值填充其中一个字段。
但是,@SubclassMapping
不取任何除数域或表达式。
我找到了唯一的解决方案来修饰LegMapper,并编写基于discriminator属性的自定义逻辑,并选择三个leg子类映射器中的一个。
是否有一种声明性的方式来实现这一点?不需要反向映射
只有在发布问题并寻找更多相关答案后,我才找到了解决方案。映射属性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);
}