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,这是您的基本方法的来源。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...