有时候在做接口调试的时候,需要获取某个接口发送的消息内容和接收到的消息内容,以便输出到日志或者控制台上进行数据分析。
下面就是对xfire 的webservice接口来实现这个功能。
在services.xml中进行如下配置
以下是某个接口在配置文件中的定义
<service>
<name>服务名</name>
<serviceClass>
服务实现类
</serviceClass>
<serviceFactory>
org.codehaus.xfire.jaxb2.JaxbServiceFactory
</serviceFactory>
<style>document</style>
<use>literal</use>
<scope>application</scope>
<outHandlers>
<handler handlerClass="org.codehaus.xfire.util.dom.DOMOutHandler"/>
<handler handlerClass ="com.jetsen.soap.SoapXmlHander" ></handler >
</outHandlers>
<inHandlers>
<handler handlerClass="org.codehaus.xfire.util.dom.DOMInHandler"/>
<handler handlerClass ="com.jetsen.soap.SoapXmlHander" ></handler >
</inHandlers>
</service>
以下是实现的 SoapXmlHander
package com.jetsen.soap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.handler.AbstractHandler;
import org.codehaus.xfire.util.dom.DOMInHandler;
import org.codehaus.xfire.util.dom.DOMOutHandler;
import org.dom4j.io.DOMReader;
import org.w3c.dom.Document;
public class SoapXmlHander extends AbstractHandler {
public void invoke(MessageContext arg0) throws Exception {
Log log = LogFactory.getLog(this.getClass());
Document inputDoc = (Document) arg0.getInMessage().getProperty(DOMInHandler.DOM_MESSAGE);
if(inputDoc!=null){
log.info("/r/n------------input Soap xml-------------");
log.info(this.buildDocment(inputDoc).asXML());
}
Document outputDoc = (Document) arg0.getOutMessage().getProperty(DOMOutHandler.DOM_MESSAGE);
if(outputDoc!=null){
log.info("/r/n------------output Soap xml-------------");
log.info(this.buildDocment(outputDoc).asXML());
}
log.info("---------------------------------------------------/r/n");
}
public org.dom4j.Document buildDocment(org.w3c.dom.Document domDocument) {
DOMReader xmlReader = new DOMReader();
return xmlReader.read(domDocument);
}
}
具体的解释就不多说了,做过webservice的应该能看懂了。