2011-10-18 1 views
0

J'essaye de coder mon premier service web SOAP.Exception Unmarshall pour SOAP effectuée avec contrat-first Spring-WS

Je reçois la réponse SOAP échec Unmarshall qui est la réponse que j'ai mappée à org.springframework.oxm.UnmarshallingFailureException. J'ai configuré Spring pour utiliser Castor (un) marshaller. 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; 
} 

le mappage 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 sur la base de deux fichiers XML 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 ressort WSDL 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 im ake:

<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> 
+0

Essayez de donner à la trace complète de la pile de l'exception, comme connecté sur le serveur. –

Répondre

0

Résolu! 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 vis 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> 
Questions connexes