CXF的Interceptor在每个请求响应之前或响应之后,做一些事情。这里的Interceptor就和Filter、Struts的Interceptor很类似,提供它的主要作用就是为了很好的降低代码的耦合性,提供代码的内聚性。下面我们就看看CXF的Interceptor是怎么样工作的。
我们还是使用上一篇文章的工程,做一些添加与修改!
1、客户端的拦截器
在UserServiceClient.java添加拦截器
- package com.wy.object.client;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Random;
- import org.apache.cxf.interceptor.LoggingInInterceptor;
- import org.apache.cxf.interceptor.LoggingOutInterceptor;
- import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
- import com.wy.object.Users;
- import com.wy.object.entry.User;
- import com.wy.object.server.IUserService;
- /**
- * 调用UserService客户端
- *
- * @author Administrator
- *
- */
- public class UserServiceClient {
- public static void main(String[] args) {
- // 调用WebService
- JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
- factory.setServiceClass(IUserService.class);
- factory.setAddress("http://localhost:8080/WebServiceCXF/services/IUserService");
- // 拦截器
- factory.getInInterceptors().add(new LoggingInInterceptor());
- factory.getOutInterceptors().add(new LoggingOutInterceptor());
- IUserService service = (IUserService) factory.create();
- //string
- System.out.println("@@@@@@@@@@@@@Client getUserByName@@@@@@@@@@@@@@");
- User user = service.getUserByName("Jack");
- System.out.println("Client: "+ user);
- user.setAddress("China-BeiJing");
- //object JavaBean
- service.setUser(user);
- //传递集合的包装对象 List
- System.out.println("#############Client getUsers###################");
- Users users = service.getUsers(4);
- System.out.println("Client: "+ users);
- List<User> tempUsers = new ArrayList<User>();
- for (User u : users.getUsers()) {
- System.out.println("Client: "+ u);
- u.setName("Jack" + new Random().nextInt(100));
- u.setAddress("Chian-BeiJing # " + new Random().nextInt(100));
- tempUsers.add(u);
- }
- users.getUsers().clear();
- users.getUsers().addAll(tempUsers);
- service.setUsers(users);
- //传递集合的包装对象 Array
- System.out.println("$$$$$$$$$$$$Client getUserArray$$$$$$$$$$$$$$$");
- users = service.getUserArray(4);
- User[] userArr = new User[4];
- int i = 0;
- for (User u : users.getUserArr()) {
- System.out.println("Client: "+ u);
- u.setName("Jack" + new Random().nextInt(100));
- u.setAddress("Chian-ShenZhen # " + new Random().nextInt(100));
- userArr[i] = u;
- i++;
- }
- users.setUserArr(userArr);
- service.setUserArray(users);
- //传递集合的包装对象 Map
- System.out.println("------------Client getUserMap----------------");
- users = service.getUserMap();
- System.out.println("Client: "+ users.getMaps());
- users.getMaps().put("ABA", userArr[0]);
- service.setUserMap(users);
- }
- }
2、 刚才是客户端添加Interceptor,现在我们自己编写一个Interceptor,这个Interceptor需要继承 AbstractPhaseInterceptor,实现handleMessage和一个带参数的构造函数。然后在服务器端添加这个 Interceptor。
- package com.wy.object.interceptor;
- import org.apache.cxf.interceptor.Fault;
- import org.apache.cxf.message.Message;
- import org.apache.cxf.phase.AbstractPhaseInterceptor;
- @SuppressWarnings("unchecked")
- public class MessageInterceptor extends AbstractPhaseInterceptor {
- public MessageInterceptor(String phase) {
- super(phase);
- }
- @Override
- public void handleMessage(Message msg) throws Fault {
- System.out.println("############handleMessage##########");
- System.out.println(msg);
- if (msg.getDestination() != null) {
- System.out.println(msg.getId() + "#"
- + msg.getDestination().getMessageObserver());
- }
- if (msg.getExchange() != null) {
- System.out.println(msg.getExchange().getInMessage() + "#"
- + msg.getExchange().getInFaultMessage());
- System.out.println(msg.getExchange().getOutMessage() + "#"
- + msg.getExchange().getOutFaultMessage());
- }
- }
- }
发布服务和添加自定义拦截器的代码:
- package com.wy.object;
- import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
- import org.apache.cxf.phase.Phase;
- import com.wy.object.interceptor.MessageInterceptor;
- import com.wy.object.server.IUserService;
- import com.wy.object.server.impl.UserService;
- public class DeployInterceptorUserService {
- @SuppressWarnings("unchecked")
- public static void main(String[] args) throws InterruptedException {
- // 发布WebService
- JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
- // 设置Service Class
- factory.setServiceClass(IUserService.class);
- factory.setAddress("http://localhost:8080/WebServiceCXF/services/IUserService");
- // 设置ServiceBean对象
- factory.setServiceBean(new UserService());
- // 添加请求和响应的拦截器,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.out.println("Server exit ");
- System.exit(0);
- }
- }
DeployInterceptorUserService.java与DeployUserService.java在发布服务的略有不同:
以前发布WebService是用Endpoint的push方法。
这里用的是JaxWsServerFactoryBean和客户端调用的代码JaxWsProxyFactoryBean。