Я собирался создать задачу на 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)». org.system.wsdl.legacy.SellGarlicRequest fromCloud (запрос org.system.wsdl.cloud.SellGarlicRequest);
в основном сопоставление будет происходить следующим образом: EntityNew -> JaxbElement -> FieldNew -> FieldOld -> JaxbElement -> EntityOld
как я читал здесь (https://stackoverflow.com/a/46015381/2583044), сопоставление JaxbElement с T тривиален для MapStruct, и для сопоставления T с JaxbElement нужно использовать аннотацию «использует» и предоставить 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
или я просто не умею его хорошо готовить?