Mapstruct: Abstract source class error: No property named

Mapstruct: Abstract source class error: No property named

我有一个摘要 class,我应该使用 Mapstruct 将其映射到 DTO 中:

@Data    
public abstract class Car {
    private String color;
}

@Data
public class ElectricCar extends Car {
    private Double batteryCapacity;
}

@Data
public class FuelCar extends Car {
    private Double engineSize;
}

@Data
public class CarDto {
    private String color;
    private Double batteryCapacity;
    private Double engineSize;
}

@Mapper
public interface CarMapper {
    @Mapping( source = "batteryCapacity", target="battery")
    @Mapping( source = "engineSize", target="engine")
    CarDto toTarget(Car source);
}

映射器将失败并出现错误:错误:没有 属性 名为“batteryCapacity”。

如何使这些字段可选,以便在源中没有退出时它们具有默认值 class?

对于这个特定的例子,新的 SubclassMapping 将起作用。

例如

@Mapper
public interface CarMapper {

    @SubclassMapping( target = CarDto.class, source = FuelCar.class)
    @SubclassMapping( target = CarDto.class, source = ElectricCar.class)
    CarDto toTarget(Car source);
}

如您所见,无需定义特定的 @Mapping 注释,因为 MapStruct 将在不同目标类型之间创建隐式映射,并且属性将被隐式映射。