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。