2013-05-14 248 views
2

我必須使用具有問題的wsdl服務(無法更改它)。起初我必須定製映射,因爲生成的類是用java.x包裝的。現在我生成香草客戶端,並試圖使用它:使用有問題的wsdl服務 - 意外的元素異常

Services handle = new Services(new URL("http://172.16.1.2:8080/axis2/services/x?wsdl")); 
    ServicesPortType service = handle 
      .getServicesHttpSoap11Endpoint(); 


    x.y.ws.datamodels.xsd.ObjectFactory obj = new x.y.ws.datamodels.xsd.ObjectFactory(); 

    IPInterfaceInfo sourceIPInterface = obj.createIPInterfaceInfo(); 
      service.getInformation(sourceIPInterface); 

反正這個代碼是字面上無所事事,只包含空值trows異常:

WARNING: Interceptor for {http://workflowprocessor.ws.y.x}Services# {http://workflowprocessor.ws.y.x}getBandwidthInformation has thrown exception, unwinding now 
org.apache.cxf.interceptor.Fault: Unmarshalling Error: unexpected element (uri:"http://datamodels.ws.y.x/xsd", local:"infoString"). Expected elements are <{http://logging.util.java/xsd}resourceBundleName>,<{http://logging.util.java/xsd}resourceBundle>,<{http://logging.util.java/xsd}parent>,<{http://logging.util.java/xsd}useParentHandlers>,<{http://logging.util.java/xsd}filter>,<{http://logging.util.java/xsd}handlers>,<{http://logging.util.java/xsd}level>,<{http://logging.util.java/xsd}name> 
at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:822) 
at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:643) 
at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:157) 
at org.apache.cxf.interceptor.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:109) 
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263) 
at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:799) 
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1635) 
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1502) 
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1410) 
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) 
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:650) 
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) 
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263) 
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:533) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:463) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:366) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:319) 
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:88) 
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:134) 
at $Proxy34.getBandwidthInformation(Unknown Source) 
at adva.SimpleTest.main(SimpleTest.java:33) 

產生的原因:javax.xml.bind中.UnmarshalException

+0

您是否檢查過您收到的回覆是否符合wsdl的規定?那個wsdl有什麼問題? – SpaceTrucker 2013-05-14 10:29:20

+0

它從禁止的java命名空間開始。這就是我稱之爲問題的原因。 – teodozjan 2013-05-14 10:41:39

+0

@SpaceTrucker你的意思是在解析響應時發生錯誤,而不是請求? – teodozjan 2013-05-14 10:48:15

回答

4

驗證可以通過設置一個選項set-jaxb-validation-event-handler,例如被禁用:

Services servicehandle = new Services(new URL("http://172.16.2.3:8080/axis2/services/x?wsdl")); 
    ServicesPortType port = servicehandle 
      .getServicesHttpSoap11Endpoint(); 



     java.util.Map<String, Object> requestContext = 
           ((javax.xml.ws.BindingProvider) 
       port).getRequestContext(); 
    requestContext.put("set-jaxb-validation-event-handler", "false"); 
+0

謝謝,我試圖修復WSDL和我收到的模式的噩夢。 – ronnyfm 2016-07-15 17:17:48

+0

這沒有奏效。當然,我不會收到錯誤消息,而是收到空對象。 – ronnyfm 2016-08-03 22:19:32

1
14:35:57,346 WARN [org.apache.cxf.phase.PhaseInterceptorChain]() Interceptor for ****** has thrown exception, unwinding now: org.apache.cxf.interceptor.Fault: Unmarshalling Error: 2015-10-01T06:44:26+137:00 
     at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:881) [cxf-rt-databinding-jaxb-2.7.11.jar:2.7.11] 
     at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:702) [cxf-rt-databinding-jaxb-2.7.11.jar:2.7.11] 
     at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:160) [cxf-rt-databinding-jaxb-2.7.11.jar:2.7.11] 

得到了上述錯誤,通過跳過驗證來解決。添加下面。謝謝Teodozjan。

java.util.Map<String, Object> requestContext = 
           ((javax.xml.ws.BindingProvider) 
       port).getRequestContext(); 
    requestContext.put("set-jaxb-validation-event-handler", "false"); 
+1

請不要發表評論作爲答覆 – zero298 2015-10-27 23:11:41