2010-04-12 7 views
5

J'ai développé une application de service Web simple utilisant Apache CXF 2.2.7 et Spring 3, déployée sur Tomcat en tant que fichier WAR, mais je reçois ce qui suit message d'erreur:Apache CXF 2.2.7 Printemps 3 Web Service Unmarshalling Erreur: élément inattendu

12-Apr-2010 15:56:12 org.apache.cxf.phase.PhaseInterceptorChain doDefaultLogging WARNING: Interceptor for { http://services.aristabi.com/ }ReportingServiceImplService#{ http://services.aristabi.com/ }getNewBusinessVolumeByCreateDate_v2 has thrown exception, unwinding now org.apache.cxf.interceptor.Fault: Unmarshalling Error: unexpected element (uri:" http://services.aristabi.com/ ", local:"searchCriteria"). Expected elements are <{}searchCriteria> at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:764) at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:623) at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:128) at org.apache.cxf.interceptor.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:106) at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:243) at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:109) at org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:98) at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:406) at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:178) at org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:142) at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179) at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:103) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) at java.lang.Thread.run(Thread.java:619) Caused by: javax.xml.bind.UnmarshalException - with linked exception: [javax.xml.bind.UnmarshalException: unexpected element (uri:" http://services.aristabi.com/ ", local:"searchCriteria"). Expected elements are <{}searchCriteria>] at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:425) at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:362) at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:339) at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:749) ... 25 more Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:" http://services.aristabi.com/ ", local:"searchCriteria"). Expected elements are <{}searchCriteria> at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:642) at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:254) at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:249) at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:116) at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.childElement(Loader.java:101) at com.sun.xml.bind.v2.runtime.unmarshaller.StructureLoader.childElement(StructureLoader.java:245) at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:478) at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:459) at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.handleStartElement(StAXStreamConnector.java:242) at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:176) at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:360) ... 27 more Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:" http://services.aristabi.com/ ", local:"searchCriteria"). Expected elements are <{}searchCriteria> ... 38 more

Ceci est probablement un problème simple, mais je ne peux pas sembler capable de le résoudre. Quelqu'un peut-il me diriger dans la bonne direction pour résoudre ce problème?

Merci, Zahanghir

BTW, voici ce que mon wsdl ressemble

<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions name="ReportingServiceImplService" targetNamespace="http://services.aristabi.com/" xmlns:ns1="http://cxf.apache.org/bindings/xformat" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://services.aristabi.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<wsdl:types> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://services.aristabi.com/" xmlns:tns="http://services.aristabi.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="getNewBusinessVolumeByCreateDate" type="tns:getNewBusinessVolumeByCreateDate" /> 
<xs:element name="getNewBusinessVolumeByCreateDateResponse" type="tns:getNewBusinessVolumeByCreateDateResponse" /> 
<xs:element name="getNewBusinessVolumeByCreateDate_v2" type="tns:getNewBusinessVolumeByCreateDate_v2" /> 
<xs:element name="getNewBusinessVolumeByCreateDate_v2Response" type="tns:getNewBusinessVolumeByCreateDate_v2Response" /> 
<xs:element name="newBusinessLead" type="tns:newBusinessLead" /> 
<xs:element name="quotes" type="tns:quotes" /> 
<xs:element name="searchCriteria" type="tns:searchCriteria" /> 
<xs:complexType name="getNewBusinessVolumeByCreateDate"> 
<xs:sequence> 
    <xs:element minOccurs="0" name="agent" type="xs:string" /> 
    <xs:element minOccurs="0" name="broker" type="xs:string" /> 
    <xs:element minOccurs="0" name="businessUnit" type="xs:string" /> 
    <xs:element minOccurs="0" name="fromMonth" type="xs:string" /> 
    <xs:element minOccurs="0" name="fromYear" type="xs:string" /> 
    <xs:element minOccurs="0" name="region" type="xs:string" /> 
    <xs:element minOccurs="0" name="toMonth" type="xs:string" /> 
    <xs:element minOccurs="0" name="toYear" type="xs:string" /> 
</xs:sequence> 
</xs:complexType> 
<xs:complexType name="getNewBusinessVolumeByCreateDateResponse"> 
<xs:sequence> 
    <xs:element minOccurs="0" name="return" type="tns:newBusinessLead" /> 
</xs:sequence> 
</xs:complexType> 
<xs:complexType name="newBusinessLead"> 
<xs:sequence> 
    <xs:element maxOccurs="unbounded" minOccurs="0" name="convertedQuotes" nillable="true" type="tns:quotes" /> 
    <xs:element maxOccurs="unbounded" minOccurs="0" name="declinedQuotes" nillable="true" type="tns:quotes" /> 
    <xs:element maxOccurs="unbounded" minOccurs="0" name="ntuQuotes" nillable="true" type="tns:quotes" /> 
    <xs:element maxOccurs="unbounded" minOccurs="0" name="pendingQuotes" nillable="true" type="tns:quotes" /> 
    </xs:sequence> 
</xs:complexType> 
<xs:complexType name="quotes"> 
<xs:sequence> 
    <xs:element minOccurs="0" name="month" type="xs:string" /> 
    <xs:element name="premium" type="xs:int" /> 
    <xs:element minOccurs="0" name="quoteStatus" type="xs:string" /> 
    <xs:element name="volume" type="xs:int" /> 
    <xs:element minOccurs="0" name="year" type="xs:string" /> 
</xs:sequence> 
</xs:complexType> 
<xs:complexType name="arrayList"> 
<xs:complexContent> 
    <xs:extension base="tns:abstractList"> 
    <xs:sequence /> 
    </xs:extension> 
</xs:complexContent> 
</xs:complexType> 
<xs:complexType abstract="true" name="abstractList"> 
<xs:complexContent> 
    <xs:extension base="tns:abstractCollection"> 
    <xs:sequence /> 
    </xs:extension> 
</xs:complexContent> 
</xs:complexType> 
<xs:complexType abstract="true" name="abstractCollection"> 
<xs:sequence /> 
</xs:complexType> 
<xs:complexType name="getNewBusinessVolumeByCreateDate_v2"> 
<xs:sequence> 
    <xs:element minOccurs="0" name="searchCriteria" type="tns:searchCriteria" /> 
</xs:sequence> 
</xs:complexType> 
<xs:complexType name="searchCriteria"> 
<xs:sequence> 
    <xs:element minOccurs="0" name="agent" type="xs:string" /> 
    <xs:element minOccurs="0" name="broker" type="xs:string" /> 
    <xs:element minOccurs="0" name="businessUnit" type="xs:string" /> 
    <xs:element minOccurs="0" name="fromMonth" type="xs:string" /> 
    <xs:element minOccurs="0" name="fromYear" type="xs:string" /> 
    <xs:element minOccurs="0" name="region" type="xs:string" /> 
    <xs:element minOccurs="0" name="toMonth" type="xs:string" /> 
    <xs:element minOccurs="0" name="toYear" type="xs:string" /> 
</xs:sequence> 
</xs:complexType> 
<xs:complexType name="getNewBusinessVolumeByCreateDate_v2Response"> 
<xs:sequence> 
    <xs:element minOccurs="0" name="return" type="tns:newBusinessLead" /> 
</xs:sequence> 
</xs:complexType> 
<xs:element name="InvalidUserCredentialsException" type="tns:InvalidUserCredentialsException" /> 
<xs:complexType name="InvalidUserCredentialsException"> 
<xs:sequence /> 
</xs:complexType> 
<xs:element name="tokenString" nillable="true" type="xs:string" /> 
</xs:schema> 
</wsdl:types> 
<wsdl:message name="InvalidUserCredentialsException"> 
<wsdl:part element="tns:InvalidUserCredentialsException" name="InvalidUserCredentialsException"> 
</wsdl:part> 
</wsdl:message> 
<wsdl:message name="getNewBusinessVolumeByCreateDateResponse"> 
<wsdl:part element="tns:getNewBusinessVolumeByCreateDateResponse" name="parameters"> 
</wsdl:part> 
</wsdl:message> 
<wsdl:message name="getNewBusinessVolumeByCreateDate"> 
<wsdl:part element="tns:getNewBusinessVolumeByCreateDate" name="parameters"> 
</wsdl:part> 
<wsdl:part element="tns:tokenString" name="tokenString"> 
</wsdl:part> 
</wsdl:message> 
<wsdl:message name="getNewBusinessVolumeByCreateDate_v2Response"> 
<wsdl:part element="tns:getNewBusinessVolumeByCreateDate_v2Response" name="parameters"> 
</wsdl:part> 
</wsdl:message> 
<wsdl:message name="getNewBusinessVolumeByCreateDate_v2"> 
<wsdl:part element="tns:getNewBusinessVolumeByCreateDate_v2" name="parameters"> 
</wsdl:part> 
</wsdl:message> 
<wsdl:portType name="IReportingService"> 
<wsdl:operation name="getNewBusinessVolumeByCreateDate"> 
    <wsdl:input message="tns:getNewBusinessVolumeByCreateDate" name="getNewBusinessVolumeByCreateDate"> 
</wsdl:input> 
    <wsdl:output message="tns:getNewBusinessVolumeByCreateDateResponse" name="getNewBusinessVolumeByCreateDateResponse"> 
</wsdl:output> 
</wsdl:operation> 
<wsdl:operation name="getNewBusinessVolumeByCreateDate_v2"> 
    <wsdl:input message="tns:getNewBusinessVolumeByCreateDate_v2" name="getNewBusinessVolumeByCreateDate_v2"> 
</wsdl:input> 
    <wsdl:output message="tns:getNewBusinessVolumeByCreateDate_v2Response" name="getNewBusinessVolumeByCreateDate_v2Response"> 
</wsdl:output> 
    <wsdl:fault message="tns:InvalidUserCredentialsException" name="InvalidUserCredentialsException"> 
</wsdl:fault> 
</wsdl:operation> 
</wsdl:portType> 
<wsdl:binding name="ReportingServiceImplServiceSoapBinding" type="tns:IReportingService"> 
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> 
<wsdl:operation name="getNewBusinessVolumeByCreateDate"> 
    <soap:operation soapAction="" style="document" /> 
    <wsdl:input name="getNewBusinessVolumeByCreateDate"> 
    <soap:header message="tns:getNewBusinessVolumeByCreateDate" part="tokenString" use="literal"> 
    </soap:header> 
    <soap:body parts="parameters" use="literal" /> 
    </wsdl:input> 
    <wsdl:output name="getNewBusinessVolumeByCreateDateResponse"> 
    <soap:body use="literal" /> 
    </wsdl:output> 
</wsdl:operation> 
<wsdl:operation name="getNewBusinessVolumeByCreateDate_v2"> 
    <soap:operation soapAction="" style="document" /> 
    <wsdl:input name="getNewBusinessVolumeByCreateDate_v2"> 
    <soap:body use="literal" /> 
    </wsdl:input> 
    <wsdl:output name="getNewBusinessVolumeByCreateDate_v2Response"> 
    <soap:body use="literal" /> 
    </wsdl:output> 
    <wsdl:fault name="InvalidUserCredentialsException"> 
    <soap:fault name="InvalidUserCredentialsException" use="literal" /> 
    </wsdl:fault> 
</wsdl:operation> 
</wsdl:binding> 
<wsdl:service name="ReportingServiceImplService"> 
<wsdl:port binding="tns:ReportingServiceImplServiceSoapBinding" name="ReportingServiceImplPort"> 
    <soap:address location="http://localhost:8889/AristaInsuranceServices/reportingService" /> 
</wsdl:port> 
</wsdl:service> 
</wsdl:definitions> 

Je n'ai pas XSD. Pouvez-vous s'il vous plaît signaler ce qui ne va pas avec le WSDL?

Répondre

4

Le message entrant n'est pas valide. Fondamentalement, il ne correspond pas au schéma. (Ou du moins ce que JAXB attend) En fait, quelque part dans le message, vous avez un élément comme:

<ns1:searchCriteria> ..... </ns1:searchCriteria> 

ou peut-être sans préfixe d'espace de noms, mais avec un espace de noms par défaut défini quelque part. Toutefois, JAXB s'attend à ce que l'élément soit non qualifié. quelque chose comme:

<searchCriteria> ..... </searchCriteria> 

Certainement vérifier le côté émetteur pour voir ce qu'ils envoient ainsi que de vérifier le schéma pour voir ce que le schéma dit qu'il devrait ressembler. (elementFormDefault = non qualifié est la valeur par défaut si elle n'est pas spécifiée)

+0

Merci, j'ai édité ma question originale et j'ai ajouté mon WSDL. Pouvez-vous s'il vous plaît signaler ce qui ne va pas avec le wsdl. BTW, je n'ai pas de XSD. – Zahanghir

+0

Modifiez elementFormDefault = "non qualifié" en "qualifié" et régénérez tous les objets jaxb et il acceptera votre message soap. –

+0

Ok - j'ai créé un fichier package-info.java et annotés avec les éléments suivants: @ javax.xml.bind.annotation.XmlSchema ( attributeFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED, elementFormDefault = javax Btw, j'utilise l'approche Java-first. – Zahanghir

9

Je sais que cette question date d'un an sans réponse acceptée, mais j'avais exactement la même erreur aujourd'hui.

Comme l'affiche de la question originale, j'ai un service Java-First avec une méthode qui renvoie un objet. Le problème pour moi était que j'ai ajouté une propriété supplémentaire au bean qui est retourné par la méthode de service. Une fois que j'ai republié/redéployé le service, la classe générée côté client jaxb pour l'objet de retour n'était plus identique au type complexe WSDL côté serveur (les classes côté client manquaient de la nouvelle propriété) et j'avais donc l'exception "élément inattendu" avec le nom de la propriété manquante.

Une fois que j'ai régénéré tous les objets jaxb à l'aide de WsdlToJava, le code côté client fonctionnait normalement.

J'ai également trouvé une solution de contournement suggérée pour cette situation où vous pourriez ne pas vouloir régénérer votre code client chaque fois qu'une propriété change du côté du serveur. La solution consiste essentiellement à ignorer l'exception d'élément inattendu du côté client car il s'agit de nouveaux éléments que votre code existant n'utilise pas. Lien ici à la solution:
http://whileonefork.blogspot.com/2010/11/cxf-backwards-compatibility-adding.html

+0

Merci beaucoup! Cela a aidé beaucoup. – javamonkey79

0

J'ai eu un problème similaire, mais la raison était les espaces dans le nom de l'élément dans le schéma XSD. elemname__. Je l'ai juste corrigé à elemname et maintenant cela fonctionne. L'erreur a été levée car xml avait elemname et non elemname__.

Questions connexes