У меня возникла проблема, и после нескольких дней поиска ответа я решил, что лучше обратиться за онлайн-помощью.
Итак, у меня есть WSDL от клиента, который я не могу изменить. Я положил здесь эквивалентную версию:
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns:tns="http://apache.org/handlers"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:x1="http://apache.org/handlers/types"
name="WsdlInvestigation"
targetNamespace="http://apache.org/handlers">
<types>
<xsd:schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://apache.org/handlers/types"
elementFormDefault="qualified">
<complexType name="getSomeDataParam">
<sequence>
<element name="inputParam" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="getSomeDataResponse">
<sequence>
<element name="return" type="xsd:int"/>
</sequence>
</complexType>
<complexType name="FaultDetail">
<sequence>
<element name="faultInfo" type="xsd:string"/>
<element name="message" type="xsd:string"/>
</sequence>
</complexType>
</xsd:schema>
</types>
<message name="getSomeDataRequest">
<part name="parameters" type="x1:getSomeDataParamType"/>
</message>
<message name="getSomeDataResponse">
<part name="result" type="x1:getSomeDataResponseType"/>
</message>
<message name="wsdlInvestigationFault">
<part name="faultDetail" type="x1:FaultDetailType" />
</message>
<portType name="WsdlInvestigationPortType">
<operation name="getSomeData">
<input message="tns:getSomeDataRequest"/>
<output message="tns:getSomeDataResponse"/>
<fault name="wsdlInvestigationFault" message="tns:wsdlInvestigationFault"/>
</operation>
</portType>
<binding name="WsdlInvestigationBinding" type="tns:WsdlInvestigationPortType">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="getSomeData">
<soap:operation soapAction="getSomeData"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
<fault name="wsdlInvestigationFault">
<soap:fault name="wsdlInvestigationFault" use="literal"/>
</fault>
</operation>
</binding>
<service name="WsdlInvestigationService">
<port name="WsdlInvestigationPort" binding="tns:WsdlInvestigationBinding">
<soap:address location="http://localhost:9000/handlers/WsdlInvestigationService/WsdlInvestigationPort"/>
</port>
</service>
</definitions>
Когда я помещаю свой WSDL в SoapUi, я могу создать такой запрос:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ="http://apache.org/handlers/types">
<soapenv:Header/>
<soapenv:Body>
<parameters>
<!--1 or more repetitions:-->
<typ:inputParam>?</typ:inputParam>
</parameters>
</soapenv:Body>
</soapenv:Envelope>
Я использую плагин maven cxf-codegen-plugin для генерации исходников.
Вот кусок моего pom.xml
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.version}</version>
<executions>
<execution>
<id>generate-SOAPService1</id>
<phase>generate-sources</phase>
<configuration>
<wsdlOptions>
<wsdlOption>
<wsdl>${wsdl.file}</wsdl>
<bareMethods/>
<extraargs>
<!-- Add "toString" to objects -->
<extraarg>-xjc-Xts</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-xjc-ts</artifactId>
<version>2.2.12</version>
</dependency>
</dependencies>
</plugin>
Сгенерированный сервис выглядит так:
@WebService(targetNamespace = "http://apache.org/handlers", name = "WsdlInvestigationPortType")
@XmlSeeAlso({org.apache.handlers.types.ObjectFactory.class})
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public interface WsdlInvestigationPortType {
@WebMethod(action = "getSomeData")
@WebResult(name = "result", targetNamespace = "", partName = "result")
public org.apache.handlers.types.GetSomeDataResponseType getSomeData(
@WebParam(partName = "parameters", name = "parameters", targetNamespace = "")
org.apache.handlers.types.GetSomeDataParamType paramPackage
) throws WsdlInvestigationFault;
}
Как мы видим, метод "getSomeData" использует параметр "GetSomeDataParamType".
Если мы войдем в класс GetSomeDataParamType, мы не увидим класс, аннотированный @XmlRootElement, поэтому я не могу маршалировать свой объект «request» с помощью jaxb и в итоге получить исключение.
Проблема в том, что я не могу изменить WSDL.
Что я мог сделать, чтобы создать правильный метод обслуживания и надлежащие классы, которые можно было бы маршалировать?
Я попытался немного поработать с Jaxb, но безуспешно.
Заранее спасибо за вашу поддержку