当前位置: 首页 > 知识库问答 >
问题:

用Mapstruct映射类的层次结构

顾骏祥
2023-03-14

我有一个类的层次结构:VehicleDTO是一个基本抽象类CarDTO、TruckDTO、VanDTO。

我在映射器的另一边有相同的层次结构:车辆BO

我想将所有映射逻辑合并到一个映射器中。句号。

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

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

那么,我如何指定一个工厂方法,该方法基于特定属性的值或pojo的类,为我创建一个目标对象?我会喜欢一个好的代码片段,它实际上可以做到这一点。

谢谢!


共有2个答案

子车新立
2023-03-14

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

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

燕昊东
2023-03-14
匿名用户

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

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

@Mapper
public interface VehicleMapper {

    VehicleDTO map(VehicleBO vehicle);

    // more
}

如果您添加一个如下所示的方法

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

然后,MapStruct将使用< code>createVehicleDto来创建< code>VehicleDTO对象。

请注意,当映射层次结构并且映射看起来像答案中的映射时,MapStruct将只映射< code>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请求生成开箱即用的代码,例如我的示例。

 类似资料:
  • SQLAlchemy支持三种继承形式: 单表继承 ,其中几种类型的类由一个表表示, 具体的表继承 ,其中每种类型的类都由独立的表表示,并且 联接表继承 ,其中类层次结构在依赖表中被分解,每个类都由其自己的表表示,该表只包含该类的本地属性。 最常见的继承形式是单表和联接表,而具体的继承则面临更多的配置挑战。 在继承关系中配置映射器时,SQLAlchemy可以加载元素 polymorphically

  • 当使用 Declarative 样式是在许多类之间共享一些功能,例如一组公共列、一些公共表选项或其他映射属性。标准的Python习惯用法是让类继承自一个包含这些常见特性的超类。 当使用声明性映射时,通过使用mixin类,以及通过增加 registry.generate_base() 方法或 declarative_base() 功能。 下面是一些常见的混合成语的例子: from sqlalchem

  • 我不熟悉Mapstruct,在特定用例中遇到问题 因此,如果我的来源属性hotmail.com我的目标属性应该收到“个人”,如果我的来源facebook.com我的目标应该收到“公司”。 我想用表达法,但没法绕过它。我该怎么做?

  • Mapstruct在Spring-Boot rest api中使用一对多和多对一关系映射我的实体时遇到了一个问题。 我有下面的课 因此,当我在评论中添加私有UserDTO用户时;进入PolicyDTO和公共列表PolicyList;进入UserDTO 结果策略列出了所有字段中的值都可以,当然,除了两个注释字段。如果我用双向关系将这两个字段取消注释到DTO中,结果不仅在关系字段中是null,而且在所

  • 我尝试使用MapStruct编写映射器类,如下所示: 目前它显示了“未知属性”“customer.customerid”和“usertypes.usertype.userid”等错误。有人能帮我用MapStruct映射所有这些元素吗? 问题2:我们如何绘制跟踪图?1)customerId usertypes->user->userid 2)pdtPrice offers->OffersType->