如何使用 Mapstruct 克服命名冲突

How do I overcome a naming conflict using Mapstruct

我的映射器:

@Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface HoursLocRecord_to_MasterHoursDtoMapper extends StandardMapper<HoursLocRecord, MasterHoursDto> {
        @Mapping(source = "totalOperatingHours.value", target = "totalHours")
        @Mapping(source = "trigger.value", target = "trigger")
        MasterHoursDto map(HoursLocRecord data);

}

目标 bean:

public class HoursDto implements IAssetInfo, Serializable {
  private Double totalHours;
  private Long trigger;
}

源bean:

public class HoursLocRecord implements Serializable {
  protected ParsedDecimal totalOperatingHours;
  protected ParsedUnsignedShort trigger;
}

ParsedUnsignedShort

public class ParsedUnsignedShort {
  protected int value;
}

所以你可以看到上面的 Trigger 在 'source' 中是一个 ParsedUnsignedShort,在 'target' 中是一个 Long。当我得到这个时,某处发生了名称冲突:

Error:(42, 6) java: Can't map property "cat.tmatic.mh.domain.pl6xx.ParsedUnsignedShort trigger" to "java.lang.Long trigger". Consider to declare/implement a mapping method: "java.lang.Long map(cat.tmatic.mh.domain.pl6xx.ParsedUnsignedShort value)".

奇怪的是我没有映射那两个!我正在将 trigger.value 映射到 trigger。我想我遇到了名称冲突,但无法克服。我们不得不重命名一个变量来克服这一点,但 mapstruct 必须比这更聪明。求助!

更新

感谢下面的 Rohan Bhattacharya,我在没有扩展 StandardMapper.class(他没有使用它)的情况下重新进行了测试。编译成功了。

public interface StandardMapper<From, To> {

  /**
   * Maps from one object to another.
   */
  To map(From from);

  /**
   * Update the object.
   */
  To update(From from, @MappingTarget To to);
}

然后我将它连接起来并删除了 'update' 方法和 bam,它编译了。显然,在使用 @MappingTarget 注释时出现上述错误。生成的代码必须尝试 use/create 相同的方法,我得到了 mappingError。因为我不需要 'update' 我可以删除它并关闭它,但我认为这仍然是 Mapstruct 中的一个错误。

如果我没理解错的话,你实际上创建了一个像这样的映射器(注意,缺少扩展):

@Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface HoursLocRecord_to_MasterHoursDtoMapper  {

        //  your overriden method To map(From from);
        @Mapping(source = "totalOperatingHours.value", target = "totalHours")
        @Mapping(source = "trigger.value", target = "trigger")
        MasterHoursDto map(HoursLocRecord data);

        // no mappings defined here, so MapStruct will try to generate
        // those missing mapping based on name similarity.
        MasterHoursDto update(HoursLocRecord from, @MappingTarget MasterHoursDto to);

如果您想继续使用基础 class,您可以这样做:

@Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface HoursLocRecord_to_MasterHoursDtoMapper extends StandardMapper<HoursLocRecord, MasterHoursDto> {
        @Mapping(source = "totalOperatingHours.value", target = "totalHours")
        @Mapping(source = "trigger.value", target = "trigger")
        MasterHoursDto map(HoursLocRecord data);

        @InheritConfiguration // tell MapStruct to apply the same mappings as the method above with the same source / target
        MasterHoursDto update(HoursLocRecord from, @MappingTarget MasterHoursDto to);