我有一个类的层次结构: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的类,为我创建一个目标对象?我会喜欢一个好的代码片段,它实际上可以做到这一点。
谢谢!
现在,使用Visitor模式可能是更好的选择,而不是instanceOf方式,请查看以下内容:
https://techlab.bol.com/en/blog/mapstruct-object-hierarchies
匿名用户
您可以使用带有@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->