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?{??
- ????static?void?main(String[]?args)?{??
- ??????????
- ????????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());??
发布服务和添加自定义拦截器的代码:
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.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在发布服务的略有不同:
以前发布WebService是用Endpoint的push方法。
这里用的是JaxWsServerFactoryBean和客户端调用的代码JaxWsProxyFactoryBean。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!