CXF的Interceptor在每个请求响应之前或响应之后,做一些事情。这里的Interceptor就和Filter、Struts的Interceptor很类似,提供它的主要作用就是为了很好的降低代码的耦合性,提供代码的内聚性。下面我们就看看CXF的Interceptor是怎么样工作的。
1、客户端的拦截器
- 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 {
- 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 # " + tempusers.add(u);
- }
- users.getUsers().clear();
- users.getUsers().addAll(tempusers);
- service.setUsers(users);
- //传递集合的包装对象 Array
- System.out.println("$$$$$$$$$$$$Client getUserArray$$$$$$$$$$$$$$$");
- users = service.getUserArray( User[] userArr = new User[4];
- int i = 0;
- for (User u : users.getUserArr()) {
- u.setAddress("Chian-ShenZhen # " + 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")
class MessageInterceptor extends AbstractPhaseInterceptor {
public MessageInterceptor(String phase) {
super(phase);
@Override
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() != System.out.println(msg.getExchange().getInMessage() + "#"
+ msg.getExchange().getInFaultMessage());
System.out.println(msg.getExchange().getoutMessage() + "#"
+ msg.getExchange().getoutFaultMessage());
发布服务和添加自定义拦截器的代码:
import org.apache.cxf.jaxws.JaxWsServerfactorybean;
import org.apache.cxf.phase.Phase;
import com.wy.object.interceptor.MessageInterceptor;
import com.wy.object.server.impl.UserService;
class DeployInterceptorUserService {
void main(String[] args) throws InterruptedException {
// 发布WebService
JaxWsServerfactorybean factory = new JaxWsServerfactorybean();
// 设置Service Class
// 设置ServiceBean对象
factory.setServiceBean(new UserService());
// 添加请求和响应的拦截器,Phase.RECEIVE只对In有效,Phase.SEND只对Out有效
new MessageInterceptor(Phase.RECEIVE));
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在发布服务的略有不同:
package com.wy.object;
以前发布WebService是用Endpoint的push方法。
这里用的是JaxWsServerfactorybean和客户端调用的代码JaxWsProxyfactorybean。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。