cxf学习日记2
来源:互联网 发布:wifi网络超时怎么解决 编辑:程序博客网 时间:2024/05/21 02:19
主要学习拦截器的使用。
1、在客户端上设置拦截器Interceptor
2、在服务器端设置拦截器。
http://www.cnblogs.com/hoojo/archive/2011/03/30/1999499.html
三、CXF对Interceptor拦截器的支持
前面在Axis中介绍过Axis的Handler,这里CXF的Interceptor就和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.IHelloWorldService2011-3-18 7:34:00 org.apache.cxf.interceptor.AbstractLoggingInterceptor log信息: Outbound Message---------------------------ID: 1Address: http://localhost:9000/helloWorldEncoding: UTF-8Content-Type: text/xmlHeaders: {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: 1Response-Code: 200Encoding: UTF-8Content-Type: text/xml;charset=UTF-8Headers: {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输出的日志信息,分别在请求和响应的时候输出日志信息,还有输出请求的时候参数的信息以及响应的时候返回值的信息。
2、 刚才是客户端添加Interceptor,现在我们自己编写一个Interceptor,这个Interceptor需要继承AbstractPhaseInterceptor,实现handleMessage和一个带参数的构造函数。然后在服务器端添加这个Interceptor。
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"));
}
}
- cxf学习日记2
- CXF学习笔记2
- CXF调用webservice日记
- WebService CXF学习(高级篇2):CXF+Spring+Hibernate
- WebService CXF学习(高级篇2):CXF+Spring+Hibernate
- cxf学习
- CXF 学习
- cxf 学习
- CXF学习
- cxf 学习
- JSP学习日记 - 2
- 学习.net日记2
- javap 学习日记~2
- 黑马学习日记2
- C++学习日记 2
- LINUX 学习日记-2
- Swift 学习日记2
- java学习日记2
- 《从军行七首·其四》 王昌龄
- nginx+php 限制每个站点的目录范围,防止跨站
- FreeType与CFF
- “Island of isolation” of Garbage Collection
- 理解互斥量和信号量
- cxf学习日记2
- Scala学习笔记5 (集合 Collections)
- vim中做简单运算
- javascript 点击<div> javascript 点击链接 用javaScript点击id、点击className、再点击一个tagName
- Scala学习笔记6 (io)
- VC获得本机网络连接状态
- camera: V4l2 data struct
- 炮炮兵可爱桌面壁纸 高清
- Hibernate4在开发当中的一些改变