如何解决MapStruct与地图无关的相似类
我在各种软件包中有一堆同名的类,它们具有相同的属性。假设每个类都是这样的:
public class MiddlewareHeaderType {
private String longPrefixRequestId;
private String abcReason;
private String defSubject;
}
com.mycompany.generated.ws.serviceA.MiddlewareHeader;
com.mycompany.generated.ws.serviceB.MiddlewareHeader;
com.mycompany.generated.ws.serviceC.MiddlewareHeader;
...
只要生成了它们,我就无法更改它们(比如说XSD)。我想有一个通用对象,例如MySoapHeader
用作可使用MapStruct和Java 11转换为此类生成的类的源数据(我不仅限于Java 8功能)。
public class MySoapHeader {
private String requestId;
private String reason;
private String subject;
}
我不愿意为每个生成的标头对象创建一个单独的映射器类,只要有数百个。但是它们几乎相同。
我的尝试不适用于通用值,并且在任何地方都找不到解决类似问题的答案:
@Named("base")
@Mapping(target = "longPrefixRequestId",source = "requestId")
@Mapping(target = "abcReason",source = "reason")
@Mapping(target = "defSubject",source = "subject")
<T> T base(MySoapHeader mySoapHeader);
@Mapping(target = "MiddlewareHeaderType",qualifiedByName = "base")
com.mycompany.generated.ws.serviceA.MiddlewareHeaderType serviceAHeader(MySoapHeader mySoapHeader);
@Mapping(target = "MiddlewareHeaderType",qualifiedByName = "base")
com.mycompany.generated.ws.serviceB.MiddlewareHeaderType serviceBHeader(MySoapHeader mySoapHeader);
@Mapping(target = "MiddlewareHeaderType",qualifiedByName = "base")
com.mycompany.generated.ws.serviceC.MiddlewareHeaderType serviceCHeader(MySoapHeader mySoapHeader);
解决方法
您正在寻找的是诸如映射合成之类的东西。我们已经在1.4中添加了此支持(现在仍为Beta)。
以此,您可以定义自己的自定义映射注释。
例如
@Retention(RetentionPolicy.CLASS)
@Mapping(target = "longPrefixRequestId",source = "requestId")
@Mapping(target = "abcReason",source = "reason")
@Mapping(target = "defSubject",source = "subject")
public @interface SoapHeaderMapping { }
然后在您的映射器中可以执行以下操作:
@Mapper
public interface HeaderMapper {
@SoapHeaderMapping
com.mycompany.generated.ws.serviceA.MiddlewareHeaderType serviceAHeader(MySoapHeader mySoapHeader);
@SoapHeaderMapping
com.mycompany.generated.ws.serviceB.MiddlewareHeaderType serviceBHeader(MySoapHeader mySoapHeader);
@SoapHeaderMapping
com.mycompany.generated.ws.serviceC.MiddlewareHeaderType serviceCHeader(MySoapHeader mySoapHeader);
}
可以找到更多信息here
,乍一看,您似乎已经颠倒了 target 和 source 属性。您在requestId
中有MySoapHeader.class
,这是您的基本方法的来源。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。