SOAP WS (JAX-WS) с реализацией Java: я получаю нулевые параметры из-за квалифицированного пространства имен - PullRequest
1 голос
/ 22 января 2020

Я получил проект SOAP с JAX-WS, и в моем файле WSDL атрибут elementFormDefault установлен на qualified. Из-за этого сгенерированный запрос xml имеет пространство имен (proj :) перед всеми элементами:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:proj="http://my-project.com/Project">
   <soapenv:Header/>
   <soapenv:Body>
      <proj:Consultation>
         <proj:Header>
            <proj:WSVersion>value</proj:WSVersion>
            <proj:TimeRequete>value</proj:TimeRequete>
            <proj:IDRequest>value</proj:IDRequest>
         </proj:Header>
         <proj:Element1>value</proj:Element1>
         <proj:Element2>value</proj:Element2>
         <proj:limit>value</proj:limit>
      </proj:Consultation>
   </soapenv:Body>
</soapenv:Envelope>

Проблема в том, что на стороне сервера все элементы, которые я получаю, являются нулевыми. Но когда я удаляю тег namespace из элементов (например, когда атрибут elementFormDefault установлен в unqualified), я могу получить доступ ко всем своим элементам, и он работает отлично. Например:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:proj="http://my-project.com/Project">
   <soapenv:Header/>
   <soapenv:Body>
      <proj:Consultation>
         <Header>
            <WSVersion>value</proj:WSVersion>
            <TimeRequete>value</proj:TimeRequete>
            <IDRequest>value</proj:IDRequest>
         </Header>
         <Element1>value</proj:Element1>
         <Element2>value</proj:Element2>
         <limit>value</proj:limit>
      </proj:Consultation>
   </soapenv:Body>
</soapenv:Envelope>

К сожалению, я не могу изменить elementFormDefault на unqualified: я не могу изменить файл WSDL ... и все сгенерированные запросы получили тег пространства имен "proj:" перед элементом в запросе xml.

Я искал, и я уверен, что это проблема пространства имен с некоторыми аннотациями, как в @WebResult, @WebMethod et c. на стороне сервера, но я попытался изменить все это, установить пространства имен, удалить их ... Кажется, это не работает.

Вот мой файл WSDL:

<wsdl:definitions
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
        xmlns:tns="http://my-project.com/Project"
        xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
        xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="MyProject"
        targetNamespace="http://my-project.com/Project"
>
    <wsdl:types>
        <xsd:schema elementFormDefault="qualified" targetNamespace="http://my-project.com/Project"  xmlns:tns="http://my-project.com/Project">

            <xsd:element name="DefaultFault">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element minOccurs="1" name="CodeError" type="xsd:string"/>
                        <xsd:element minOccurs="1" name="LibelleError" type="xsd:string"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>

            <xsd:simpleType name="Element1Type">
                <xsd:restriction base="xsd:string">
                    <xsd:minLength value="1"/>
                    <xsd:maxLength value="1"/>
                </xsd:restriction>
            </xsd:simpleType>
            <xsd:simpleType name="Element2Type">
                <xsd:restriction base="xsd:string">
                    <xsd:minLength value="0"/>
                    <xsd:maxLength value="30"/>
                </xsd:restriction>
            </xsd:simpleType>
            <xsd:simpleType name="Element3Type">
                <xsd:restriction base="xsd:string">
                    <xsd:minLength value="0"/>
                    <xsd:maxLength value="30"/>
                </xsd:restriction>
            </xsd:simpleType>
            <xsd:simpleType name="Element4Type">
                <xsd:restriction base="xsd:string">
                    <xsd:minLength value="0"/>
                    <xsd:maxLength value="20"/>
                </xsd:restriction>
            </xsd:simpleType>
            <xsd:simpleType name="Element5Type">
                <xsd:restriction base="xsd:string">
                    <xsd:minLength value="0"/>
                    <xsd:maxLength value="10"/>
                </xsd:restriction>
            </xsd:simpleType>
            <xsd:simpleType name="Element6Type">
                <xsd:restriction base="xsd:string">
                    <xsd:minLength value="0"/>
                    <xsd:maxLength value="50"/>
                </xsd:restriction>
            </xsd:simpleType>

            <xsd:element name="Consultation">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="Header" type="tns:HeaderRequeteType"/>
                        <xsd:element minOccurs="0" name="Element1" type="tns:Element1Type"/>
                        <xsd:element minOccurs="0" name="Element2" type="tns:Element2Type"/>
                        <xsd:element minOccurs="0" name="limit" type="xsd:int"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="ConsultationResponse">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="Header" type="tns:HeaderReponseType"/>
                        <xsd:element name="Element3" type="tns:Element3Type"/>
                        <xsd:element name="offset" type="xsd:int"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>

            <xsd:element name="Update">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="Header" type="tns:HeaderRequeteType"/>
                        <xsd:element minOccurs="0" name="Element4" type="tns:Element4Type"/>
                        <xsd:element minOccurs="0" name="Element5" type="tns:Element5Type"/>
                        <xsd:element name="data" type="xsd:string"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="UpdateResponse">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="Header" type="tns:HeaderReponseType"/>
                        <xsd:element name="Element6" type="tns:Element6Type"/>
                        <xsd:element name="element" type="xsd:string"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>

            <xsd:complexType name="HeaderRequeteType">
                <xsd:sequence>
                    <xsd:element name="WSVersion" type="xsd:string"/>
                    <xsd:element name="TimeRequete" type="xsd:dateTime"/>
                    <xsd:element name="IDRequest" type="xsd:string"/>
                </xsd:sequence>
            </xsd:complexType>
            <xsd:complexType name="HeaderReponseType">
                <xsd:sequence>
                    <xsd:element name="WSVersion"  type="xsd:string"/>
                    <xsd:element name="TimeReponse" type="xsd:dateTime"/>
                    <xsd:element name="TimeRequete" type="xsd:dateTime"/>
                    <xsd:element name="IDResponse" type="xsd:string"/>
                </xsd:sequence>
            </xsd:complexType>

        </xsd:schema>
    </wsdl:types>

    <wsdl:message name="MyProject_DefaultFaultMessage">
        <wsdl:part name="fault" element="tns:DefaultFault" />
    </wsdl:message>

    <wsdl:message name="MyProject_Consultation_InputMessage">
        <wsdl:part name="request" element="tns:Consultation"/>
    </wsdl:message>
    <wsdl:message name="MyProject_Consultation_OutputMessage">
        <wsdl:part name="response" element="tns:ConsultationResponse"/>
    </wsdl:message>

    <wsdl:message name="MyProject_Update_InputMessage">
        <wsdl:part name="request" element="tns:Update"/>
    </wsdl:message>
    <wsdl:message name="MyProject_Update_OutputMessage">
        <wsdl:part name="response" element="tns:UpdateResponse"/>
    </wsdl:message>

    <wsdl:portType name="MyProject">
        <wsdl:operation name="Consultation">
            <wsdl:input message="tns:MyProject_Consultation_InputMessage"/>
            <wsdl:output message="tns:MyProject_Consultation_OutputMessage"/>
            <wsdl:fault name="defaultFault" message="tns:MyProject_DefaultFaultMessage"/>
        </wsdl:operation>
        <wsdl:operation name="Update">
            <wsdl:input message="tns:MyProject_Update_InputMessage"/>
            <wsdl:output message="tns:MyProject_Update_OutputMessage"/>
            <wsdl:fault name="defaultFault" message="tns:MyProject_DefaultFaultMessage"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="BasicHttpBinding_MyProject" type="tns:MyProject">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="Consultation">
            <soap:operation soapAction="http://my-project.com/Project/Consultation" style="document"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
            <wsdl:fault name="defaultFault">
                <soap:fault name="defaultFault" use="literal"/>
            </wsdl:fault>
        </wsdl:operation>
        <wsdl:operation name="Update">
            <soap:operation soapAction="http://my-project.com/Project/Update" style="document"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
            <wsdl:fault name="defaultFault">
                <soap:fault name="defaultFault" use="literal"/>
            </wsdl:fault>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="MyProject">
        <wsdl:port name="BasicHttpBinding_MyProject" binding="tns:BasicHttpBinding_MyProject">
            <soap:address location="http://my-project.com/Project"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

Реализация Java:

package web.service.server.myproject;


@WebService(name = "myProject", targetNamespace = "http://my-project.com/Project")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public class MyProjectServiceImpl implements MyProjectService {

    @Override
    @WebMethod(operationName = "Consultation", action = "http://my-project.com/Project/Consultation")
    @WebResult(name = "ConsultationResponse", targetNamespace = "http://my-project.com/Project", partName = "response")
    public ConsultationResponse consultation(Consultation request)
        throws MyProjectDefaultMessage {

            // some code...

        }

    @Override
    @WebMethod(operationName = "Update", action = "http://my-project.com/Project/Update")
    @WebResult(name = "UpdateResponse", targetNamespace = "http://my-project.com/Project", partName = "response")
    public UpdateResponse update(Update request)
        throws MyProjectDefaultMessage {

            // some code ...

        }
}

И некоторые элементы:

package web.service.server.myproject.types;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "header",
    "element1",
    "element2",
    "limit"
})
@XmlRootElement(name = "Consultation")
public class Consultation {

    @XmlElement(name = "Header", required = true)
    protected HeaderRequeteType header;
    @XmlElement(name = "Element1")
    protected String element1;
    @XmlElement(name = "Element2")
    protected String element2;
    protected Integer limit;

    // getters and setters

}

и

package web.service.server.myproject.types;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "EnteteRequeteType", propOrder = {
    "VersionWS",
    "timeRequete",
    "idRequest",
})

public class HeaderRequeteType {

    @XmlElement(name = "WVersionS", required = true)
    protected String versionWS;
    @XmlElement(name = "TimeRequete", required = true)
    @XmlSchemaType(name = "dateTime")
    protected XMLGregorianCalendar timeRequete;
    @XmlElement(name = "IDRequest", required = true)
    protected String idRequest;

    // getters and setters

}

Я также попытался добавить в @XmlType пространство имен, но это не сработало

Примечание:

  • Я изменил имена и т.д. c. из WSDL и кода java, чтобы было проще анализировать. Я также сильно их уменьшил. Если есть какие-то небольшие опечатки, это не проблема.
  • На стороне сервера кажется, что он распознает запрос как объект «Консультация» или «Обновление», но все внутри равно нулю ( Header, Element1, Element2 ...)
  • Если вам нужно больше информации, не стесняйтесь спрашивать

Если кто-то может мне помочь, я был бы очень благодарен, эта проблема на самом деле ведет я безумен Спасибо!

1 Ответ

0 голосов
/ 23 января 2020

Мне наконец удалось решить проблему.

Я добавил

package-info. java

класс в моем пакете с все типы моего веб-сервиса.

@javax.xml.bind.annotation.XmlSchema(namespace = "http://my-project.com/Project", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package web.service.server.myproject.types;

Если я правильно понимаю, это помещает аннотацию на уровне пакета, чтобы все мои элементы были связаны с моим пространством имен.

Я надеюсь, что это поможет в следующем люди с такой же проблемой:)

...