2010-04-12 3 views
5

Ich habe eine einfache Web-Service-Anwendung mit Apache CXF 2.2.7 und Spring 3 entwickelt, auf Tomcat als eine WAR-Datei bereitgestellt, aber ich bekomme Folgendes Fehlermeldung:Apache CXF 2.2.7 Frühling 3 Web Service Unmarshalling Fehler: Unerwartete Element

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

Dies ist wahrscheinlich ein einfaches Problem, aber ich kann nicht in der Lage sein, es zu lösen. Kann mir jemand in die richtige Richtung zeigen, um dieses Problem zu lösen?

Danke, Zahanghir

Btw, ist das, was meine Wsdl wie

sieht
<?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> 

Ich habe keine XSD haben. Kannst du bitte darauf hinweisen, was mit der WSDL nicht stimmt?

Antwort

4

Die eingehende Nachricht ist ungültig. Im Grunde stimmt es nicht mit dem Schema überein. (Oder zumindest das, was JAXB erwartet) Grundsätzlich irgendwo in der Nachricht, haben Sie ein Element wie:

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

oder möglicherweise ohne Namespacepräfix, aber mit einem Standard-Namespace irgendwo gesetzt. JAXB erwartet jedoch, dass das Element nicht qualifiziert ist. so etwas wie:

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

Auf jeden Fall überprüfen Sie die Sendeseite, um zu sehen, was sie auch zu prüfen, das Schema sehen senden, was das Schema sagt es aussehen soll. (elementFormDefault = unqualifiziert ist der Standard, wenn nicht angegeben)

+0

Danke, ich habe meine ursprüngliche Frage bearbeitet und meine WSDL hinzugefügt. Kannst du bitte darauf hinweisen, was mit der WSDL nicht stimmt? Übrigens, ich habe keine XSD. – Zahanghir

+0

Ändern Sie ElementFormDefault = "unqualifiziert" in "qualifiziert" und regenerieren Sie alle Jaxb-Objekte und es würde Ihre Soap-Nachricht akzeptieren. –

+0

Ok - Ich habe eine package-info.java Datei und kommentierte sie mit den folgenden: @ javax.xml.bind.annotation.XmlSchema ( attribute = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED, ElementFormDefault- = javax .xml.bind.annotation.XmlNsForm.QUALIFIED) Btw, ich benutze den Java-First-Ansatz. – Zahanghir

9

Ich weiß, dass diese Frage ein Jahr alt ist mit keine akzeptierte Antwort, aber ich hatte genau den gleichen Fehler heute.

Wie das ursprüngliche Frage-Poster, habe ich einen Java-First-Service mit einer Methode, die ein Objekt zurückgibt. Das Problem für mich war, dass ich der Bean, die von der Service-Methode zurückgegeben wird, eine zusätzliche Eigenschaft hinzugefügt habe.

Sobald ich den Dienst erneut veröffentlicht/erneut implementiert, die Client-Seite Jaxb generierte Klasse für das Rückgabeobjekt war nicht mehr das selbe wie die Server-Seite WSDL-Komplex-Typ (dh die Client-Seiten Klassen fehlte die neue Eigenschaft) und so hatte ich die Ausnahme "Unerwartetes Element" mit dem Namen der fehlenden Eigenschaft.

Sobald ich alle Jaxb-Objekte mit WsdlToJava wiedergeneriert hatte, funktionierte der clientseitige Code wie gewohnt.

Ich stieß auch auf eine vorgeschlagene Problemumgehung für diese Situation, in der Sie Ihren Clientcode möglicherweise nicht jedes Mal neu generieren möchten, wenn sich eine Eigenschaft auf der Serverseite ändert. Die Lösung besteht im Wesentlichen darin, die unerwartete Elementausnahme auf der Clientseite zu ignorieren, da es sich um neue Elemente handelt, die von Ihrem vorhandenen Code nicht verwendet werden. Link hier zur Lösung:
http://whileonefork.blogspot.com/2010/11/cxf-backwards-compatibility-adding.html

+0

Vielen Dank! Das half ziemlich viel. – javamonkey79

0

Ich hatte ein ähnliches Problem, aber der Grund war der Leerzeichen im Elementnamen im Schema xsd. elemname__. Ich habe es gerade korrigiert auf elemname und jetzt funktioniert es. Der Fehler wurde ausgelöst, weil xml elemname nicht elemname__ hatte.

Verwandte Themen