【问题标题】:Mapping Hierarchy of Classes with Mapstruct使用 Mapstruct 映射类的层次结构
【发布时间】:2022-05-11 16:49:43
【问题描述】:

我有一个类层次结构:VehicleDTO 是一个基本抽象类。 CarDTO, TruckDTO, VanDTO 扩展自它。

我在映射器的另一侧有相同的层次结构: VehicleBO <- CarBO, TruckBO, VanBO.

我希望将所有映射逻辑合并到一个映射器中。期间。

我已经为公共属性定义了映射,但是当它变得有趣时,我在编译期间得到了这个异常:

The return type ... is an abstract class or interface.
Provide a non abstract / non interface result type or a factory method. 

那么,我如何指定一个工厂方法,它基于特定属性的值或 pojo 的一个类,将为我创建一个目标对象?我会很感激有一个很好的代码 sn-p 确实可以解决问题。

谢谢!

【问题讨论】:

  • 你的映射器是什么样子的?

标签: mapstruct


【解决方案1】:

您可以使用带有@ObjectFactory 注释的方法接收您需要的源参数。

假设您有一个如下所示的映射器:

@Mapper
public interface VehicleMapper {

    VehicleDTO map(VehicleBO vehicle);

    // more
}

如果你添加一个看起来像这样的方法:

@ObjectFactory
default VehicleDTO createVehicleDto(VehicleBO vehicle) {
    // your creation logic
}

然后 MapStruct 将使用createVehicleDto 创建VehicleDTO 对象。

注意当映射层次结构并且映射看起来像答案中的那个时,MapStruct 将仅映射 VehicleDTO 类中的属性,而不是该类的可能实现。原因是 MapStruct 在编译期间而不是在运行时生成映射代码。

对于像您解释的那样映射层次结构,您可以执行以下操作:

public interface VehicleMapper {

    default VehicleDTO map(VehicleBO vehicle) {
        if (vehicle instanceOf CarBO) {
            return map((CarBO) vehicle);
        } else if (vehicle instanceOf TruckBO) {
            return map((TruckBO) vehicle);
        } else if (vehicle instanceOf VanBO) {
            return map((VanBO) vehicle);
        } else {
            //TODO decide what you want to do
        }
    }

    @Named("car")
    CarDTO map(CarBO car);

    @Named("truck")
    TruckDTO map(TruckBO truck);

    @Named("car")
    VanDTO map(VanBO van);

    // more
}

mapstruct/mapstruct#131 请求生成像我的示例一样的开箱即用代码

【讨论】:

  • 我有一个后续问题,你提到只会映射公共字段,我可以用@MappingTarget注释的一堆方法来帮助我设置子类特定字段吗?
  • 你不需要@MappingTarget。您还可以为不同类型之间的映射定义专用方法。您可以创建VehicleDTO map(VehicleBO vehicle) 并进行检查实例并委托给其他方法
  • 如果我像您建议的那样创建一个方法:“您可以制作 VehicleDTO 地图(VehicleBO 车辆)并进行检查实例并委托给其他方法”使用 mapstruct 有什么意义?也许我没有达到你的目标。
  • 看看我的编辑。 MapStruct 是一个在编译期间生成代码的注释处理器。它不知道运行时对象的可能类型
【解决方案2】:

现在,也许使用访问者模式可能是更好的选择,而不是 instanceOf 方式,请查看以下内容:

https://techlab.bol.com/en/blog/mapstruct-object-hierarchies

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    相关资源
    最近更新 更多