如何使用Mapstruct克服命名冲突

问题描述 投票:2回答:1

我的映射器:

@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。当我收到此消息时,某处发生名称冲突:

错误:(42,6)java:无法映射属性“ cat.tmatic.mh.domain.pl6xx.ParsedUnsignedShort触发器”“ java.lang.Long触发器”。考虑声明/实现映射方法:“ java.lang.Longmap(cat.tmatic.mh.domain.pl6xx.ParsedUnsignedShort值)“。

奇怪的是我没有映射这两个!我正在将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批注时,出现了以上错误。生成的代码必须尝试使用​​/创建相同的方法,并且我得到了mappingError。由于不需要“更新”,因此可以将其删除并关闭,但我认为这仍然是Mapstruct中的错误。

java mapstruct
1个回答
0
投票

对不起,但我无法重现此错误。以下是我的课程。如果我错过了什么,请告诉我。

源Bean:

public class HoursDto {
    private Long trigger;

    public Long getTrigger() {
        return trigger;
    }

    public void setTrigger(Long trigger) {
        this.trigger = trigger;
    }       
}

目标豆:

public class HoursLocRecord {
    protected ParsedUnsignedShort trigger;

    public ParsedUnsignedShort getTrigger() {
        return trigger;
    }

    public void setTrigger(ParsedUnsignedShort trigger) {
        this.trigger = trigger;
    }       
}

Class ParsedUnsignedShort:

public class ParsedUnsignedShort {
    protected int value;

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }       
}

映射器类:

@Mapper(
        nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, 
        unmappedTargetPolicy = ReportingPolicy.IGNORE, 
        implementationPackage = "com.mycompany.test1.mapstruct.implementation")
public interface HoursMapper {    
    HoursMapper INSTANCE = Mappers.getMapper(HoursMapper.class);

    @Mapping(source = "trigger.value", target = "trigger")
    HoursDto map(HoursLocRecord data);    
}

通过上述实现,我的编译很好,没有任何错误。生成的类如下:

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2019-11-18T21:37:32+0530",
    comments = "version: 1.3.0.Final, compiler: javac, environment: Java 1.8.0_45 (Oracle Corporation)"
)
public class HoursMapperImpl implements HoursMapper {

    @Override
    public HoursDto map(HoursLocRecord data) {
        if ( data == null ) {
            return null;
        }

        HoursDto hoursDto = new HoursDto();

        Integer value = dataTriggerValue( data );
        if ( value != null ) {
            hoursDto.setTrigger( value.longValue() );
        }

        return hoursDto;
    }

    private Integer dataTriggerValue(HoursLocRecord hoursLocRecord) {
        if ( hoursLocRecord == null ) {
            return null;
        }
        ParsedUnsignedShort trigger = hoursLocRecord.getTrigger();
        if ( trigger == null ) {
            return null;
        }
        int value = trigger.getValue();
        return value;
    }
}

如果跳过获取方法和设置方法,我确实会出错。而且我在JDK8中使用mapstruct版本1.3.0.Final。

让我知道是否错过了某件事。谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.