我有一个类层次结构: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.
Run Code Online (Sandbox Code Playgroud)
那么,我如何指定一个工厂方法,它基于特定属性的值或 pojo 的类,为我创建一个目标对象?我希望有一个能真正解决问题的好的代码片段。
谢谢!
您可以使用注释为接收源参数的方法@ObjectFactory来满足您的需要。
假设您有一个如下所示的映射器:
@Mapper
public interface VehicleMapper {
VehicleDTO map(VehicleBO vehicle);
// more
}
Run Code Online (Sandbox Code Playgroud)
如果您添加一个如下所示的方法:
@ObjectFactory
default VehicleDTO createVehicleDto(VehicleBO vehicle) {
// your creation logic
}
Run Code Online (Sandbox Code Playgroud)
然后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
}
Run Code Online (Sandbox Code Playgroud)
有mapstruct/mapstruct#131请求生成像我的示例一样的开箱即用代码
| 归档时间: |
|
| 查看次数: |
7767 次 |
| 最近记录: |