我的映射器:
@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/