java - 如何使用 Mapstruct 克服命名冲突

标签 java 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 在“源”中是一个 ParsedUnsignedShort,在“目标”中是一个 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(他没有使用它)的情况下重新进行了测试。它编译。<​​/p>

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);
}

然后我将它连接起来并删除了“更新”方法和 bam,它编译了。显然,在使用 @MappingTarget 注释时出现上述错误。生成的代码必须尝试使用​​/创建相同的方法,我得到了 mappingError。因为我不需要“更新”,所以我可以删除它并将其关闭,但我认为这仍然是 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);

如果你想继续使用基类,你可以这样做:

@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);

关于java - 如何使用 Mapstruct 克服命名冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58917594/

相关文章:

java - Android:查看表格数据

java - 检查由类组成的每个实例的用户名和密码

java - 使用构建器和 MapStruct 将 null 值映射到默认值

java - MapStruct + Lombok 一起无法编译 : unknown property in result type

spring - 使用 componentModel = "spring"的 Mapstruct 依赖注入(inject)给出空对象

java - 为什么 mvn pact :publish throws NoClassDefFoundError kotlin. TypeCastException

java - 无法使用 JBoss AS 或 Wildfly 运行 Errai Dev 模式

java - AtomicInteger.incrementAndGet 线程安全吗?

java - 带有嵌套映射器和 unmappedSourcePolicy 的 Mapstruct Bug

java - Lombok + QueryDsl + Mapstruct : error compiling: java. lang.NoClassDefFoundError : javax/persistence/Entity: javax. persistence.Entity