Question

Je suis en train de coder mon premier service Web SOAP.

Je reçois la réponse SOAP échec unmarshall qui est la réponse i mappé à org.springframework.oxm.UnmarshallingFailureException. J'ai configuré Spring à utiliser Castor (un) placier. Le problème est que je ne sais pas comment trouver une cause plus spécifique.

public class SentenceRequest {

public SentenceRequest() {}

private List<String> words = new ArrayList<String>();

public List<String> getWords() {
    return words;
}

public void setWords(List<String> words) {
    this.words = words;
}


public class SentenceResponse {

private String sentence;

public SentenceResponse() {}

public SentenceResponse(String sen) {
    sentence = sen;
}

public String getSentence() {
    return sentence;
}

public void setSentence(String sentence) {
    this.sentence = sentence;
}

la mise en correspondance de ricin:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapping PUBLIC
    "-//EXOLAB/Castor Object Mapping DTD Version 1.0//EN"
    "http://castor.exolab.org/mapping.dtd">
<mapping xmlns="http://castor.exolab.org/">
    <class name="ro.soapservice2.SentenceRequest">
        <map-to xml="SentenceRequest" ns-uri="sentence" ns-prefix="s" />
        <field name="words" collection="arraylist" type="java.util.List" required="true">
            <bind-xml name="word" node="element"></bind-xml>
        </field>
    </class>

    <class name="ro.soapservice2.SentenceResponse">
        <map-to xml="SentenceResponse" ns-uri="sentence" ns-prefix="s" />
        <field name="sentence" type="java.lang.String" required="true">
            <bind-xml name="sentence" node="element" />
        </field>
    </class>
</mapping>

le schéma (généré avec Trang.jar basé sur deux fichiers XML d'entrée):

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"      targetNamespace="sentence" xmlns:s="sentence">
  <xs:element name="SentenceRequest">
    <xs:complexType>
          <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="s:word"/>
  </xs:sequence>
</xs:complexType>
</xs:element>
  <xs:element name="word" type="xs:string"/>
    <xs:element name="SentenceResponse">
      <xs:complexType>
        <xs:sequence>
          <xs:element ref="s:sentence"/>
        </xs:sequence>
      </xs:complexType>
     </xs:element>
   <xs:element name="sentence" type="xs:string"/>
</xs:schema>

et le WSDL Spring génère:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:sch="sentence" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="sentence" targetNamespace="sentence">
  <wsdl:types>
    <xs:schema xmlns:s="sentence" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="sentence">

  <xs:element name="SentenceRequest">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="s:word"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="word" type="xs:string"/>

  <xs:element name="SentenceResponse">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="s:sentence"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="sentence" type="xs:string"/>

 </xs:schema>
</wsdl:types>

  <wsdl:message name="SentenceResponse">
    <wsdl:part element="tns:SentenceResponse" name="SentenceResponse">
    </wsdl:part>
  </wsdl:message>

  <wsdl:message name="SentenceRequest">
    <wsdl:part element="tns:SentenceRequest" name="SentenceRequest">
    </wsdl:part>
  </wsdl:message>

  <wsdl:portType name="Sentence">
    <wsdl:operation name="Sentence">
      <wsdl:input message="tns:SentenceRequest" name="SentenceRequest">
      </wsdl:input>
      <wsdl:output message="tns:SentenceResponse" name="SentenceResponse">
      </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>

  <wsdl:binding name="SentenceSoap11" type="tns:Sentence">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="Sentence">
      <soap:operation soapAction=""/>
      <wsdl:input name="SentenceRequest">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="SentenceResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>

  <wsdl:service name="SentenceService">
    <wsdl:port binding="tns:SentenceSoap11" name="SentenceSoap11">
      <soap:address location="http://localhost:8080/soapservice2/services"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

la requête SOAP je fais:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sen="sentence">
<soapenv:Header/>
 <soapenv:Body>
    <sen:SentenceRequest>
       <!--1 or more repetitions:-->
       <sen:word>asd</sen:word>
    </sen:SentenceRequest>
 </soapenv:Body>
</soapenv:Envelope>
Était-ce utile?

La solution

Solved! Tout d'abord j'ai remplacé mon résolveur d'exception de

org.springframework.ws.soap.server.endpoint.SoapFaultMappingExceptionResolver

à

org.springframework.ws.soap.server.endpoint.SimpleSoapExceptionResolver

qui remet dans la réponse SOAP réelle d'exception qui a été levée. Puis je l'ai vu le problème était au fichier de mappage XML Castor:

changé de

<field name="words" collection="arraylist" type="java.util.List" required="true">
                <bind-xml name="word" node="element"></bind-xml>
        </field>

à

<field name="words" collection="arraylist" type="java.lang.String" required="true">
                <bind-xml name="word" node="element"></bind-xml>
        </field>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top