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