WSDL2JAVA - cxf-codegen-plugin - не создает класс с @XmlRootElement - PullRequest
0 голосов
/ 01 ноября 2018

У меня возникла проблема, и после нескольких дней поиска ответа я решил, что лучше обратиться за онлайн-помощью.

Итак, у меня есть 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, но безуспешно.

Заранее спасибо за вашу поддержку

...