我必须使用有问题的wsdl服务(不能改变它)。起初我不得不自定义映射,因为生成的类在java.x包中。现在我生成了vanilla客户端并尝试使用它:
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);
无论如何,这段代码实际上什么也没做,只包含空值会产生异常:
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 :(得分: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");
答案 1 :(得分: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");