[英]How to implement client code for the getting jar which is generated by wsdl2Java by CXF?
[英]How to add interceptors to a wsdl2java (CXF) generated client?
我正在嘗試向wsdl2java
生成的客戶端的入站/出站流量添加一些日志記錄。 我有客戶端生成並使用它如下:
偽代碼:
MyService ws = new MyService().getMyServiceSoap12();
((BindingProvider)ws).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, webServiceAddress); // for dynamic endpoints...
有什么辦法可以添加一些攔截器嗎? 順便說一下,我在Spring應用程序中使用它!
如果您需要自定義日志記錄或以不同方式處理 SOAP 消息,您可以實現自己的javax.xml.ws.handler.soap.SOAPHandler
,方法如下:
MyService ws = new MyService().getMyServiceSoap12();
BindingProvider wsBindingProvider = (BindingProvider) ws;
// Get a copy of the handler chain for a protocol binding instance
List<Handler> handlers =
wsBindingProvider.getBinding().getHandlerChain();
// Add your handler(s)
handlers.add(new MySoapMessageLogger());
// We need to setHandlerChain because setHandlerChain
// returns a copy of List<Handler>
wsBindingProvider.getBinding().setHandlerChain(handlers);
MySoapMessageLogger 可能如下所示:
public class MySoapMessageLogger implements SOAPHandler<SOAPMessageContext> {
private static final Logger logger =
LoggerFactory.getLogger(MySoapMessageLogger.class);
@Override
public boolean handleMessage(SOAPMessageContext context) {
Boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
// Retrieve the message contents
ByteArrayOutputStream stream = new ByteArrayOutputStream();
context.getMessage().writeTo(stream);
// You've got your XML message and can log it right away or
// beautify it with some library before sending to log
logger.trace((isRequest ? "Request:" : "Response:") + stream.toString());
return true;
}
/* For the logging purposes the following methods can be leaved as stubs */
@Override
public Set<QName> getHeaders() {
return null;
}
@Override
public boolean handleFault(SOAPMessageContext context) {
return false;
}
@Override
public void close(MessageContext context) {
}
}
我不確定您的問題是問如何啟用內置的請求/響應日志記錄,還是替換和/或增強現有的日志記錄工具。
假設是前者,我建議查看CXF User Guide
調試、日志記錄和配置部分。 最重要的一點是 CXF 默認使用Java SE 日志記錄,這意味着如果你想使用其他東西,你需要在項目中扔一個 SLF4J 橋。
要在 Spring 配置中啟用日志合並這些位(注意cxf
命名空間):
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cxf="http://cxf.apache.org/core"
xsi:schemaLocation="
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<cxf:bus>
<cxf:features>
<cxf:logging/>
</cxf:features>
</cxf:bus>
</beans>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.