【发布时间】:2020-03-02 16:46:12
【问题描述】:
我本来打算在 github 上创建一个问题,但是问题模板说我宁愿先在这里讨论它,所以我们开始吧:
我正在尝试使用 Mapstruct 生成从 WSDL 生成的一组实体到另一个实体的映射。但是,如果不添加“默认”方法(手动映射),它就不起作用!这似乎很奇怪,因为我希望这种映射对于 Mapstruct 来说应该不难。复制案例在这里:https://github.com/62mkv/wsdl-mapstruct-repro-case
代码的要点在这里:
@Mapper(uses = {
org.system.wsdl.legacy.ObjectFactory.class
})
public interface WsMapper {
org.system.wsdl.legacy.SellGarlicRequest fromCloud(org.system.wsdl.cloud.SellGarlicRequest request);
}
上面的代码将无法编译,并带有这样的消息:
无法将属性“javax.xml.bind.JAXBElement inputParameters”映射到“javax.xml.bind.JAXBElement inputParameters”。考虑声明/实现一个映射方法:“javax.xml.bind.JAXBElement map(javax.xml.bind.JAXBElement value)”。 org.system.wsdl.legacy.SellGarlicRequest fromCloud(org.system.wsdl.cloud.SellGarlicRequest request);
基本上,映射如下:EntityNew -> JaxbElement -> FieldNew -> FieldOld -> JaxbElement -> EntityOld
正如我在这里读到的 (https://stackoverflow.com/a/46015381/2583044),从 JaxbElement 到 T 的映射对于 MapStruct 来说是微不足道的,而从 T 到 JaxbElement 的映射必须使用“uses”注释并提供 ObjectFactory.class,我就是这样做的;然而……这似乎还不够。
如果我添加这两个方法,代码编译好:
org.system.wsdl.legacy.GarlicParameterCollection garlicParameterCollectionToGarlicParameterCollection(org.system.wsdl.cloud.GarlicParameterCollection collection);
default JAXBElement<org.system.wsdl.legacy.GarlicParameterCollection> garlicParameterCollectionToGarlicParameterCollection(JAXBElement<org.system.wsdl.cloud.GarlicParameterCollection> parameterCollectionJAXBElement) {
return new org.system.wsdl.legacy.ObjectFactory().createSellGarlicRequestInputParameters(
this.garlicParameterCollectionToGarlicParameterCollection(parameterCollectionJAXBElement.getValue())
);
}
这是mapstruct 的潜在问题还是我只是不知道如何煮好?
【问题讨论】: