如何在连接失败时使用WSS4JOutInterceptor在CXF中捕获SOAP请求消息
我可以根据 但是,如果服务器不可用,我会从如何在连接失败时使用WSS4JOutInterceptor在CXF中捕获SOAP请求消息,soap,cxf,wss4j,saaj,Soap,Cxf,Wss4j,Saaj,我可以根据 但是,如果服务器不可用,我会从SAAJOutInterceptor(由WSS4JOutInterceptor添加)获得以下异常,并且不会调用LoggingCallback,因此不会显示消息: org.apache.cxf.binding.soap.SoapFault: Connection refused: connect at org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor$SAAJOutEndingInte
SAAJOutInterceptor
(由WSS4JOutInterceptor
添加)获得以下异常,并且不会调用LoggingCallback,因此不会显示消息:
org.apache.cxf.binding.soap.SoapFault: Connection refused: connect
at org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor$SAAJOutEndingInterceptor.handleMessage(SAAJOutInterceptor.java:221)
at org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor$SAAJOutEndingInterceptor.handleMessage(SAAJOutInterceptor.java:174)
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)
...
Caused by: com.ctc.wstx.exc.WstxIOException: Connection refused: connect
at com.ctc.wstx.sw.BaseStreamWriter.flush(BaseStreamWriter.java:262)
at org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor$SAAJOutEndingInterceptor.handleMessage(SAAJOutInterceptor.java:215)
...
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
at sun.net.www.http.HttpClient.New(HttpClient.java:339)
at sun.net.www.http.HttpClient.New(HttpClient.java:357)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1220)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1199)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1050)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:984)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1334)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1309)
at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.setupWrappedStream(URLConnectionHTTPConduit.java:274)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1345)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1306)
at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.onFirstWrite(URLConnectionHTTPConduit.java:307)
at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:47)
at org.apache.cxf.io.AbstractThresholdOutputStream.unBuffer(AbstractThresholdOutputStream.java:89)
at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:63)
at org.apache.cxf.io.CacheAndWriteOutputStream.write(CacheAndWriteOutputStream.java:80)
at org.apache.cxf.io.CacheAndWriteOutputStream.write(CacheAndWriteOutputStream.java:80)
at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:51)
at com.ctc.wstx.io.UTF8Writer.flush(UTF8Writer.java:100)
at com.ctc.wstx.sw.BufferingXmlWriter.flush(BufferingXmlWriter.java:242)
at com.ctc.wstx.sw.BaseStreamWriter.flush(BaseStreamWriter.java:260)
...
org.apache.cxf.binding.soap.SoapFault:连接被拒绝:连接
位于org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor$SAAJOutEndingInterceptor.handleMessage(SAAJOutInterceptor.java:221)
位于org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor$SAAJOutEndingInterceptor.handleMessage(SAAJOutInterceptor.java:174)
位于org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
位于org.apache.cxf.endpoint.clientmpl.doInvoke(clientmpl.java:531)
位于org.apache.cxf.endpoint.clientmpl.invoke(clientmpl.java:440)
位于org.apache.cxf.endpoint.clientmpl.invoke(clientmpl.java:355)
位于org.apache.cxf.endpoint.clientmpl.invoke(clientmpl.java:313)
位于org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
位于org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:140)
...
原因:com.ctc.wstx.exc.wstxio异常:连接被拒绝:连接
位于com.ctc.wstx.sw.BaseStreamWriter.flush(BaseStreamWriter.java:262)
位于org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor$SAAJOutEndingInterceptor.handleMessage(SAAJOutInterceptor.java:215)
...
原因:java.net.ConnectException:连接被拒绝:连接
位于java.net.DualStackPlainSocketImpl.waitForConnect(本机方法)
位于java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
位于java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
位于java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
位于java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
位于java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
位于java.net.socksocketimpl.connect(socksocketimpl.java:392)
位于java.net.Socket.connect(Socket.java:589)
位于sun.net.NetworkClient.doConnect(NetworkClient.java:175)
位于sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
位于sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
http.HttpClient.(HttpClient.java:242)
http.HttpClient.New(HttpClient.java:339)
http.HttpClient.New(HttpClient.java:357)
位于sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1220)
位于sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1199)
位于sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1050)
位于sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:984)
位于sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1334)
位于sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1309)
位于org.apache.cxf.transport.http.urlconnectionhttpconductor$urlconnectionwrappedoutstream.setupWrappedStream(urlconnectionhttpconductor.java:274)
位于org.apache.cxf.transport.http.httpconductor$WrappedOutputStream.handlehaderstrustcaching(httpconductor.java:1345)
位于org.apache.cxf.transport.http.httpconductor$WrappedOutputStream.onFirstWrite(httpconductor.java:1306)
位于org.apache.cxf.transport.http.urlconnectionhttpconductor$URLConnectionWrappedOutputStream.onFirstWrite(urlconnectionhttpconductor.java:307)
位于org.apache.cxf.io.AbstractWrappedOutStream.write(AbstractWrappedOutStream.java:47)
位于org.apache.cxf.io.AbstractThresholdOutputStream.unBuffer(AbstractThresholdOutputStream.java:89)
位于org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:63)
位于org.apache.cxf.io.CacheAndWriteOutputStream.write(CacheAndWriteOutputStream.java:80)
位于org.apache.cxf.io.CacheAndWriteOutputStream.write(CacheAndWriteOutputStream.java:80)
位于org.apache.cxf.io.AbstractWrappedOutStream.write(AbstractWrappedOutStream.java:51)
位于com.ctc.wstx.io.UTF8Writer.flush(UTF8Writer.java:100)
位于com.ctc.wstx.sw.BufferingXmlWriter.flush(BufferingXmlWriter.java:242)
位于com.ctc.wstx.sw.BaseStreamWriter.flush(BaseStreamWriter.java:260)
...
我需要保存请求SOAP消息以及WSS4JOutInterceptor添加的所有安全内容(证书、签名…)无论消息是否成功发送或服务器是否已启动。问题是,您必须首先写入捕获消息的输出流,并仅在onClose回调中写入网络连接:
class RequestInterceptor extends AbstractPhaseInterceptor<Message> {
OutputStream outputStream
OutputStream originalOutputStream
public RequestInterceptor() {
super(Phase.PRE_STREAM);
}
@Override
public void handleMessage(Message message) throws Fault {
originalOutputStream = message.getContent(OutputStream.class)
CacheAndWriteOutputStream newOutputStream = new CacheAndWriteOutputStream(outputStream)
message.setContent(OutputStream.class, newOutputStream)
newOutputStream.registerCallback(new CachedOutputStreamCallback() {
void onFlush(CachedOutputStream cos) {
}
void onClose(CachedOutputStream cos) {
cos.writeCacheTo(originalOutputStream)
originalOutputStream.close()
}
})
}
}
class RequestInterceptor扩展了AbstractPhaseInterceptor{
输出流输出流
OutputStream originalOutputStream
公共请求拦截器(){
超级(相位预流);
}
@凌驾
public void handleMessage(消息消息消息)引发错误{
originalOutputStream=message.getContent(OutputStream.class)
CacheAndWriteOutputStream newOutputStream=新建CacheAndWriteOutputStream(outputStream)
message.setContent(OutputStream.class,newOutputStream)
registerCallback(新CachedOutputStreamCallback()){
void onFlush(CachedOutputStream cos){
}
void onClose(CachedOutputStream cos){
cos.writeCacheTo(原始输出流)
originalOutputStream.close()
}
})
}
}