我的映射器:
@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中的错误。
对不起,但我无法重现此错误。以下是我的课程。如果我错过了什么,请告诉我。
源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。
让我知道是否错过了某件事。谢谢!