Mapstruct:抽象源类错误:没有属性命名

Posted

技术标签:

【中文标题】Mapstruct:抽象源类错误:没有属性命名【英文标题】:Mapstruct: Abstract source class error: No property named 【发布时间】:2022-01-23 00:22:00 【问题描述】:

我有一个抽象类,我应该使用 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”的属性。

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

【问题讨论】:

【参考方案1】:

对于这个特定示例,新的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 将在不同目标类型之间创建隐式映射,并且属性将被隐式映射。

【讨论】:

非常感谢您的帮助,我很高兴开发/维护 Mapstruct 的人在这里非常活跃 :) 使用 @SubclassMapping 它会引发 *** 异常,所以我必须实现:@ 987654324@ 和 CarDto toTarget(ElectricCar source) 然后它工作了 不应该有 ***。您能否在 MapStruct 问题跟踪器中创建一个问题,以便我们查看?

以上是关于Mapstruct:抽象源类错误:没有属性命名的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Mapstruct 生成没有输入参数的映射方法

映射嵌套元素 - Mapstruct

mapstruct的用法-dateFormat

MapStruct 使用指南

MapStruct 使用指南

使用 mapstruct 进行映射:错误:(22,48)java:参数“quote”的类型没有名为“quote_type”的属性