CXF对Interceptor的支持
CXF的Interceptor就和Axis的Handler的功能类似。在每个请求响应之前或响应之后,做一些事情。这里的Interceptor就和Filter、Struts的Interceptor很类似,提供它的主要作用就是为了很好的降低代码的耦合性,提供代码的内聚性。下面我们就看看CXF的Interceptor是怎么样工作的。 1、 我们就用上面的HelloWorldService,客户端的调用代码重新写一份,代码如下: package com.hoo.client; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import org.apache.cxf.phase.Phase; import com.hoo.interceptor.MessageInterceptor; import com.hoo.service.IHelloWorldService; /** * <b>function:</b>CXF WebService客户端调用代码 * @author hoojo * @createDate 2011-3-16 上午09:03:49 * @file HelloWorldServiceClient.java * @package com.hoo.client * @project CXFWebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class ServiceMessageInterceperClient { public static void main(String[] args) { //调用WebService JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.setServiceClass(IHelloWorldService.class); factory.setAddress("http://localhost:9000/helloWorld"); factory.getInInterceptors().add(new LoggingInInterceptor()); factory.getOutInterceptors().add(new LoggingOutInterceptor()); IHelloWorldService service = (IHelloWorldService) factory.create(); System.out.println("[result]" + service.sayHello("hoojo")); } }上面的CXF的拦截器是添加在客户端,同样在服务器端也是可以添加拦截器Interceptor的。运行后结果如下: 2011-3-18 7:34:00 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass 信息: Creating Service {http://service.hoo.com/}IHelloWorldServiceService from class com.hoo.service.IHelloWorldService 2011-3-18 7:34:00 org.apache.cxf.interceptor.AbstractLoggingInterceptor log 信息: Outbound Message --------------------------- ID: 1 Address: http://localhost:9000/helloWorld Encoding: UTF-8 Content-Type: text/xml Headers: {SOAPAction=[""],Accept=[*/*]} Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:sayHello xmlns:ns1="http://service.hoo.com/"><name>hoojo</name></ns1:sayHello></soap:Body></soap:Envelope> -------------------------------------- 2011-3-18 7:34:01 org.apache.cxf.interceptor.AbstractLoggingInterceptor log 信息: Inbound Message ---------------------------- ID: 1 Response-Code: 200 Encoding: UTF-8 Content-Type: text/xml;charset=UTF-8 Headers: {content-type=[text/xml;charset=UTF-8],Content-Length=[230],Server=[Jetty(7.2.2.v20101205)]} Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:sayHelloResponse xmlns:ns1="http://service.hoo.com/"><return>hoojo say: Hello World </return></ns1:sayHelloResponse></soap:Body></soap:Envelope> -------------------------------------- [result]hoojo say: Hello World 上面的部分信息是LoggingInterceptor输出的日志信息,分别在请求和响应的时候输出日志信息,还有输出请求的时候参数的信息以及响应的时候返回值的信息。 Interceptor代码如下: package com.hoo.interceptor; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.message.Message; import org.apache.cxf.phase.AbstractPhaseInterceptor; /** * <b>function:</b> 自定义消息拦截器 * @author hoojo * @createDate Mar 17,2011 8:10:49 PM * @file MessageInterceptor.java * @package com.hoo.interceptor * @project CXFWebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class MessageInterceptor extends AbstractPhaseInterceptor<Message> { //至少要一个带参的构造函数 public MessageInterceptor(String phase) { super(phase); } public void handleMessage(Message message) throws Fault { System.out.println("############handleMessage##########"); System.out.println(message); if (message.getDestination() != null) { System.out.println(message.getId() + "#" + message.getDestination().getMessageObserver()); } if (message.getExchange() != null) { System.out.println(message.getExchange().getInMessage() + "#" + message.getExchange().getInFaultMessage()); System.out.println(message.getExchange().getOutMessage() + "#" + message.getExchange().getOutFaultMessage()); } } }下面看看发布服务和添加自定义拦截器的代码: package com.hoo.service.deploy; import org.apache.cxf.jaxws.JaxWsServerFactoryBean; import org.apache.cxf.phase.Phase; import com.hoo.interceptor.MessageInterceptor; import com.hoo.service.HelloWorldService; /** * <b>function:</b>在服务器发布自定义的Interceptor * @author hoojo * @createDate 2011-3-18 上午07:38:28 * @file DeployInterceptorService.java * @package com.hoo.service.deploy * @project CXFWebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class DeployInterceptorService { public static void main(String[] args) throws InterruptedException { //发布WebService JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean(); //设置Service Class factory.setServiceClass(HelloWorldService.class); factory.setAddress("http://localhost:9000/helloWorld"); //设置ServiceBean对象 factory.setServiceBean(new HelloWorldService()); //添加请求和响应的拦截器,Phase.RECEIVE只对In有效,Phase.SEND只对Out有效 factory.getInInterceptors().add(new MessageInterceptor(Phase.RECEIVE)); factory.getOutInterceptors().add(new MessageInterceptor(Phase.SEND)); factory.create(); System.out.println("Server start ......"); Thread.sleep(1000 * 60); System.exit(0); System.out.println("Server exit "); } } 值得说的是,以前发布WebService是用Endpoint的push方法。这里用的是JaxWsServerFactoryBean和客户端调用的代码JaxWsProxyFactoryBean有点不同。 package com.hoo.client; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import com.hoo.service.IHelloWorldService; /** * <b>function:</b>CXF WebService客户端调用代码 * @author hoojo * @createDate 2011-3-16 上午09:03:49 * @file HelloWorldServiceClient.java * @package com.hoo.client * @project CXFWebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class HelloWorldServiceClient { public static void main(String[] args) { //调用WebService JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.setServiceClass(IHelloWorldService.class); factory.setAddress("http://localhost:9000/helloWorld"); IHelloWorldService service = (IHelloWorldService) factory.create(); System.out.println("[result]" + service.sayHello("hoojo")); } } The end. since? http://www.cnblogs.com/hoojo/archive/2011/03/30/1999499.html? writer?hoojo (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在子目录中部署时,Angular 6路径路径不适用于直接URL
- angularjs – Angular UI Datepicker不工作
- 如何自动忽略grep中的文件
- AngularJS中【Error: [$rootScope:inprog]】的解决办法
- 一个实例化的DATATABLE的类
- vim – 如何根据root中的文件存在使Syntastic加载不同的检查
- ofbiz的webservice接口提供(2)-数据类型的局限性
- scala宏:如何读取注释对象
- angularjs – Angular JS – 使用Karma / Jasmine测试页面重
- AngularJS如何使用route删除IE9中的#符号