我正在尝试使用Apache的CXF库为WebService开发客户端应用程序。在此特定的服务器实现中,当请求中缺少某些数据(例如,某人的ID号)时,它将返回HTTP代码403(禁止访问),但响应正文包含作为Soap Fault的应用程序特定的错误详细信息。
作为一个例子,这是我使用SoapUI收集的响应:
正如您在突出显示的文本中看到的那样,此请求中有一个响应正文。
SEND_ENDING
和POST_PROTOCOL
,但似乎无法在为Message
方法指定的handleMessage()
参数中找到它。
我想念什么?
这是我得到的异常和堆栈跟踪:
org.apache.cxf.interceptor.Fault: Could not send Message.
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:67)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:531)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:440)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:355)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:313)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:140)
at com.sun.proxy.$Proxy36.arquivo(Unknown Source)
at br.com.dgsistemas.TesteWS.main(TesteWS.java:133)
Caused by: org.apache.cxf.transport.http.HTTPException: HTTP response '403: Forbidden' when communicating with https://www.wsrestrito.caixa.gov.br/siies/WsSolicitacao
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.doProcessResponseCode(HTTPConduit.java:1620)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1627)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1572)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1373)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:673)
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:63)
... 9 more
谢谢!
答案 0 :(得分:1)
您有两个独立的问题。
首先,您必须删除分块的消息。 http://cxf.apache.org/docs/client-http-transport-including-ssl-support.html#ClientHTTPTransport(includingSSLsupport)-ANoteAboutChunking
在调用端点之前,必须禁用分块通信:
HTTPConduit conduit = (HTTPConduit) client.getConduit();
HTTPClientPolicy policy = new HTTPClientPolicy();
// Chunking is by default enabled in CXF webservices so we have to disable it.
policy.setAllowChunking(false);
conduit.setClient(policy); // update HTTP client's conduit
第二,我认为您必须删除BOM。您可以在以下维基百科注释中看到它的含义: https://en.wikipedia.org/wiki/Byte_order_mark
如果要删除BOM表,请检查以下内容: Byte order mark screws up file reading in Java
注意1:分块的消息取决于服务器设置,服务器可能 忽略您的请求设置。
注意2:如果您编写了一个 流拦截器。分块的消息没有
Content-Length
头,并且虽然实际长度小于预期的长度,但是您必须等待来自服务器的更多消息。
答案 1 :(得分:1)
您应该能够扩展AbstractSoapInterceptor,在Phase.MARSHAL阶段中注册它,并在handleMessage覆盖中提取消息。
使用SoapMessage.getExchange()。getInMessage()或.getInFaultMessage()从SOAP响应中提取消息。
答案 2 :(得分:0)
您尝试为此使用LoggingInInterceptor(See description),还是对其进行扩展并覆盖handleMessage方法。它可用于监视所有SOAP IN消息