mapstruct - 使用 Mapstruct 映射类的层次结构
问题描述
我有一个类层次结构: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 的类,将为我创建一个目标对象?我会很感激一个很好的代码片段,它实际上可以做到这一点。
谢谢!
解决方案
您可以使用带有@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请求生成像我的示例一样的开箱即用代码
推荐阅读
- xamarin.forms - 如何在 Xamarin.Forms 的通知图标中添加任何数字
- java - 谁能帮我理解为什么我得到两个不同的密钥哈希?
- node.js - npm run build elifecycle 错误代码 - 无法找出问题
- azure-devops - vsts 阶段条件:如何继续下一阶段?
- amazon-web-services - Cloud9 AWS Lambda 中的意外令牌函数
- c# - C# - Outlook VSTO - Exchange - "GetFolderFromID" 消息接口返回未知错误
- javascript - 为什么没有定义ID?
- swift - 如何使 RealmSwift RealmOptional 与 Swift Codable 兼容?
- python - bluebooth 的 Python 属性错误
- .net - 使用路径前缀在生产环境中运行 asp.net core 应用程序