2010-04-12 43 views
5

我開發了一個簡單的使用Apache CXF 2.2.7和Spring 3的Web服務應用程序,作爲WAR文件部署到Tomcat中,但是我得到以下錯誤消息:Apache CXF 2.2.7 Spring 3 Web服務解組錯誤:意外的組件

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

這可能是一個簡單的問題,但我似乎無法解決它。任何人都可以指出我正確的方向來解決這個問題嗎?

感謝, Zahanghir

順便說一句,這是我的WSDL的樣子

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

我沒有XSD。你能指出WSDL有什麼問題嗎?

回答

4

傳入消息無效。基本上,它與模式不匹配。在消息中(或者至少是JAXB期待)基本上,什麼地方,你有這樣一個元素:

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

或可能沒有命名空間前綴,但某處設置一個默認的命名空間。但是,JAXB期望元素不合格。是這樣的:

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

肯定檢查發送端,看他們發送了什麼,以及檢查模式,看看有什麼架構說它應該的樣子。 (elementFormDefault = unqualified是默認的,如果未指定的話)

+0

謝謝,我編輯了我的原始問題並添加了我的WSDL。你能指出wsdl有什麼問題嗎?順便說一句,我沒有XSD。 – Zahanghir 2010-04-12 16:03:36

+0

將elementFormDefault =「unqualified」更改爲「qualified」並重新生成所有jaxb對象,並接受您的soap消息。 – 2010-04-13 03:18:37

+0

好的 - 我創建了一個package-info.java文件並使用以下注釋: @ javax.xml.bind.annotation.XmlSchema( attributeFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED,elementFormDefault = javax .xml.bind.annotation.XmlNsForm.QUALIFIED) 順便說一句,我使用Java的第一種方法。 – Zahanghir 2010-04-13 09:25:08

9

我知道這個問題已經過了一年沒有被接受的答案,但今天我的錯誤完全一樣。

與原始問題海報一樣,我有一個返回對象的方法的Java-First服務。對我來說問題是我添加了一個額外的屬性到服務方法返回的bean。

一旦我重新發布/重新部署了服務,客戶端jaxb爲返回對象生成的類不再與服務器端WSDL複合類型相同(即客戶端類缺少新屬性),所以我有帶有缺失屬性名稱的「意外元素」異常。

一旦我使用WsdlToJava重新生成了所有的jaxb對象,客戶端代碼正常工作。

我還遇到過這種情況的建議解決方法,您可能不希望每次在服務器端更改屬性時都重新生成客戶端代碼。該解決方案基本上是忽略客戶端的意外元素異常,因爲它是針對您現有代碼不使用的新元素。鏈接到這裏的解決方案:
http://whileonefork.blogspot.com/2010/11/cxf-backwards-compatibility-adding.html

+0

非常感謝!這非常有幫助。 – javamonkey79 2012-05-30 22:25:04

0

我有一個類似的問題,但原因是在xsd模式元素名稱中的空白。 elemname__。我只是將其更正爲elemname,現在它工作。錯誤是由於xml有elemname而不是elemname__