java - Mapstruct 映射子类和父类作为源
问题描述
目前正在编写一些拦截器,将一些请求模型转换为另一个模型。我对所有不同类型的请求都有映射,但是因为它处于拦截器级别,所以我得到了请求模型的 java 对象。我为 Object 添加了一个映射,这样我就可以传递我在拦截器中得到的 Object,而不是将它转换为我有映射的类型之一,但是,它不起作用,它没有映射任何字段. 有趣的是,不知何故,当我弄乱我的映射定义的顺序时,它起作用了,但是它并不一致,所以我不确定我是如何让它起作用的。
@Mappings({
@Mapping(source = "myField", target = "myOtherField")
})
NiceModel toLoggableEntity(RequestModel1 request);
@Mappings({
@Mapping(source = "myField2", target = "myOtherField")
})
NiceModel toLoggableEntity(RequestModel2 request);
//so that I can pass Object from the interceptor without having
//to figure out which request model to cast it to
NiceModel toLoggableEntity(Object request);
解决方案
我认为这是不可能的
但是您可以在映射类中进行实现
public abstract class MyMapper {
@Mappings({
@Mapping(source = "myField", target = "myOtherField")
})
abstract NiceModel toLoggableEntity(RequestModel1 request);
@Mappings({
@Mapping(source = "myField2", target = "myOtherField")
})
abstract NiceModel toLoggableEntity(RequestModel2 request);
NiceModel toLoggableEntity(Object request) {
if (request instanceof RequestModel1) {
return toLoggableEntity((RequestModel1) request);
}
if (request instanceof RequestModel2) {
return toLoggableEntity((RequestModel2) request);
}
//manage this case
return null;
}
}
推荐阅读
- javascript - 多个 js dom 事件在谷歌开发控制台上不起作用
- elasticsearch - 在弹性搜索查询中获取路径下的嵌套对象不是嵌套类型
- ios - iOS Firebase 推送通知不适用于带有 Xcode 11.5 和 iOS 13 的模拟器
- swiftui - 如何在SwiftUI中使用符合View in ForEach的协议列表
- html - 角度js数据表修复标题滚动条
- selenium - 如何在 JMeter 中声明通用方法以在多个线程中使用脚本
- excel - 在 Excel 中使用时间比较
- azure - azure 应用服务身份验证令牌验证
- html - 中心跨度在按钮内垂直
- javascript - 如何在 Flutter 中集成 Twilio JavaScript Video 库?