我有一个类的层次结构: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的类为我创建目标对象?我希望能有一个真正的窍门。
谢谢!
答案 0 :(得分:0)
您可以使用带有@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要求开箱即用地生成类似我的示例的代码