【Apache CXF】Interceptor与Phase
server端和client端都可以使用拦截器做一些记录、转换、验证、错误处理什么的。 interceptor以phase方式组织起来,相似功能的interceptor属一个phase。 CXF提供的Interceptor有in和out的区别。
CXF中的很多组件都继承org.apache.cxf.interceptor.InterceptorProvider,以自由地添加/移除过滤器。
原先我是想直接实现phaseInterceptor或者继承AbstractPhaseInterceptor,但我以annotation方式为服务设置interceptor时必须在constructor中指定phase,而且此时interceptor无法定义一个无参constructor。 package?pac.king.webservice.interceptor; import?org.apache.cxf.binding.soap.SoapMessage; import?org.apache.cxf.binding.soap.interceptor.SoapActionInInterceptor; import?org.apache.cxf.interceptor.Fault; public?class?MyInterceptor?extends?SoapActionInInterceptor?{ ????@Override ????public?void?handleMessage(SoapMessage?m)?throws?Fault?{ ????????System.out.println(m.get(m.PROTOCOL_HEADERS)); ????????System.out.println(m.get(m.REQUEST_URL)); ????} } 有三种方式设置interceptor。
JaxWsServerFactoryBean?factory?=?new?JaxWsServerFactoryBean(); factory.setServiceClass(MyCxfServiceImpl.class); factory.setAddress("http://localhost:8080/runtrain/services/MyCxfService"); factory.create().getEndpoint().getInInterceptors().add(new?MyInterceptor(Phase.USER_PROTOCOL)); ?annotation /** ?*?Specifies?a?list?of?classes?that?are?added?to?the?inbound?interceptor ?*?chain.?This?annotation?effects?SEI?classes?and?service?implementation ?*?classes. ?*/ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public?@interface?InInterceptors?{ ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????String[]?interceptors()?default?{?}; ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????Class<??extends?Interceptor<??extends?Message>>[]?classes()?default?{?}; } 于是我可以直接写到service类上面: package?pac.king.webservice; import?java.util.HashMap; import?javax.jws.WebMethod; import?javax.jws.WebParam; import?javax.jws.WebResult; import?javax.jws.WebService; import?javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import?org.apache.cxf.interceptor.InInterceptors; import?pac.king.pojo.User; import?pac.king.webservice.interceptor.MyInterceptor; import?pac.king.webservice.utils.MyMapAdapter; @InInterceptors(classes={MyInterceptor.class}) @WebService public?interface?MyCxfService?{ ????@WebMethod ????@XmlJavaTypeAdapter(MyMapAdapter.class) ????public?@WebResult?HashMap<String,String>?convertUserInfoToMap(@WebParam?User?user); } ?XML configuration <bean?id="myInterceptor"?class="pac.king.webservice.interceptor.MyInterceptor"?/> <cxf:bus> ????<cxf:inInterceptors> ????????<ref?bean="myInterceptor"/> ????</cxf:inInterceptors> </cxf:bus> client端设置interceptor的方法几乎相同。 package?pac.king.webservice; import?java.util.Map; import?org.apache.cxf.frontend.ClientProxy; import?org.apache.cxf.phase.Phase; import?org.springframework.context.ApplicationContext; import?org.springframework.context.support.ClassPathXmlApplicationContext; import?pac.king.pojo.User; import?pac.king.webservice.interceptor.MyInterceptor; public?class?TestCase?{ ????public?static?void?main(String[]?args)?{ ????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext("classpath*:applicationContext*.xml"); ????????MyCxfService?client?=?(MyCxfService)?context.getBean("MyCxfClient"); ????????ClientProxy.getClient(client).getInInterceptors().add(new?MyInterceptor(Phase.INVOKE)); ????????Map<String,String>?map?=?client.convertUserInfoToMap(new?User("100001","King.","t;stmdtkg")); ????????System.out.println(map.get("id")); ????????System.out.println(map.get("name")); ????????System.out.println(map.get("password")); ??????????????????????????????????????????????????? ????} } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |