Java 如何使用Mapstruct克服命名冲突

Java 如何使用Mapstruct克服命名冲突,java,mapstruct,Java,Mapstruct,我的地图绘制者: @Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, unmappedTargetPolicy = ReportingPolicy.IGNORE) public interface HoursLocRecord_to_MasterHoursDtoMapper extends StandardMapper<HoursLocRecord, MasterHoursD

我的地图绘制者:

@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 HoursLocRecord implements Serializable {
  protected ParsedDecimal totalOperatingHours;
  protected ParsedUnsignedShort trigger;
}
ParsedUnsignedShort

public class ParsedUnsignedShort {
  protected int value;
}
因此,您可以看到上面的触发器在“源”中是ParsedUnsignedShort,在“目标”中是Long。当我得到以下信息时,某个地方出现了名称冲突:

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

奇怪的是我没有映射这两个!我正在将触发器.value映射到触发器。我想我遇到了名字冲突,但无法克服。我们必须重命名一个变量来克服这个问题,但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);
}
公共接口标准映射器{
/**
*从一个对象映射到另一个对象。
*/
映射(从);
/**
*更新对象。
*/
要更新(从@MappingTarget到@mappingto);
}

然后我把它连接起来,删除了“update”方法和bam,它编译了。显然,在使用@MappingTarget注释时,我遇到了上述错误。生成的代码必须尝试使用/创建相同的方法,我得到mappingError。由于我不需要“更新”,我可以删除它并将其称为关闭,但我认为这仍然是Mapstruct中的一个bug。

如果我理解正确,您实际上创建了这样一个映射器(注意,extends missing):

@Mapper(nullValuePropertyMappingStrategy=nullValuePropertyMappingStrategy.IGNORE,UnappedTargetPolicy=ReportingPolicy.IGNORE)
公共接口HoursLocRecord\u至\u MasterHoursDtoMapper{
//要映射的重写方法(从);
@映射(source=“totalOperatingHours.value”,target=“totalHours”)
@映射(source=“trigger.value”,target=“trigger”)
主小时地图(小时记录数据);
//此处未定义映射,因此MapStruct将尝试生成
//那些缺少基于名称相似性的映射。
MasterHoursDto更新(HoursLocRecord from,@MappingTarget MasterHoursDto to);
如果要继续使用基类,可以执行以下操作:

@Mapper(nullValuePropertyMappingStrategy=nullValuePropertyMappingStrategy.IGNORE,UnappedTargetPolicy=ReportingPolicy.IGNORE)
公共接口HoursLocRecord_to_MasterHoursDtoMapper扩展标准映射器{
@映射(source=“totalOperatingHours.value”,target=“totalHours”)
@映射(source=“trigger.value”,target=“trigger”)
主小时地图(小时记录数据);
@InheritConfiguration//告诉MapStruct使用相同的源/目标应用与上述方法相同的映射
MasterHoursDto更新(HoursLocRecord from,@MappingTarget MasterHoursDto to);

它可能还与从
int
Long
的自动装箱有关。但我认为错误消息建议的解决方案是合理的,只是声明一种方法可以解决您的问题。我尝试过,但也无法解决。此外,它似乎可以为我们进行这些转换。int到Long应该可以工作,但可能无法解决问题事实上,这不是我想做的。我想让它将int映射为long,而不是ParsedUnsignedShort映射为long。是的。就是这样。谢谢你的帮助!
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);
}