首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

CXF之4(拦截器(Interceptor))

2012-10-20 
CXF之四(拦截器(Interceptor))?Interceptor是CXF架构中一个重要的功能。你可以在不对核心模块进行修改的情

CXF之四(拦截器(Interceptor))

?

Interceptor是CXF架构中一个重要的功能。你可以在不对核心模块进行修改的情况下,动态添加很多功能(你可以想象Struts2拦截器的优点)。这对于CXF这个以处理消息为中心的服务框架来说是非常有用的,CXF通过在Interceptor中对消息进行特殊处理,实现了很多重要功能模块,例如:日志记录,Soap消息处理,消息的压缩处理。

? ? ??CXF已经实现了很多种拦截器,很多已经在发布、访问Web 服务时已经默认添加到拦截器链。一般情况下, 我们自己的拦截器只要继承AbstractPhaseInterceptor<T extends?org.apache.cxf.message.Message>类即可,这个类可以指定继承它的拦截器在什么阶段被启用,阶段属性可以通过org.apache.cxf.phase.Phase 中的常量指定值。

?

下面简单通过实例来表述一下CXF拦截器功能;

?

一、拦截器实现

?

1、拦截器的代码实现

?

?

public class HelloInInterceptor extends AbstractPhaseInterceptor<Message> {public HelloInInterceptor(String phase) {super(phase);}public HelloInInterceptor() {super(Phase.RECEIVE);}/** <功能详细描述> * 创 建 人:  XX * 创建时间:  2012-9-28 下午02:34:07   * @param arg0 * @throws Fault * @see [类、类#方法、类#成员] */public void handleMessage(Message message) throws Fault {System.out.println("*********In****Helloworld******");}}
?

?

注意:你要注意CXF 中的拦截器编写时不要只针对服务端或者客户端,应该是两者均可使用,另外名字要见名知意。例如:使用In、Out 标注这是一个输入时起作用还是输出时起作用的拦截器。上面的HelloInInterceptor由于在构造方法中指定在接收消息阶段有效,所以即使你把它注册到OutInterceptor 的集合中也无效。

?

2、在Spring对自定义拦截器的配置

?

?

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jaxws="http://cxf.apache.org/jaxws"xmlns:jaxrs="http://cxf.apache.org/jaxrs"xsi:schemaLocation=" http://www.springframework.org/schema/beans                     http://www.springframework.org/schema/beans/spring-beans.xsd                       http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsdhttp://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd"><import resource="classpath:META-INF/cxf/cxf.xml" /><import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /><import resource="classpath:META-INF/cxf/cxf-servlet.xml" /><bean id="inMessageInterceptor" /><bean id="outMessageInterceptor"  implementor="#HelloWorldImpl" address="/HelloWorld"  ><!-- 输入日志拦截器 -->   <jaxws:inInterceptors>      <ref bean="inMessageInterceptor"/>      <ref bean="helloInInterceptor"/>   </jaxws:inInterceptors>   <!-- 输出日志拦截器 -->   <jaxws:outInterceptors>      <ref bean="outMessageInterceptor"/>   </jaxws:outInterceptors>   <jaxws:properties>      <entry key="mtom_enabled" value="true"></entry>   </jaxws:properties>      <!--    <jaxws:features><bean address="/"><jaxrs:inInterceptors>   <ref bean="inMessageInterceptor"/></jaxrs:inInterceptors><jaxrs:outInterceptors>    <ref bean="outMessageInterceptor"/></jaxrs:outInterceptors><jaxrs:serviceBeans><ref bean="rest_HelloWorldImpl" /></jaxrs:serviceBeans><jaxrs:extensionMappings><entry key="json" value="application/json" /><entry key="xml" value="application/xml" /></jaxrs:extensionMappings><jaxrs:languageMappings><entry key="en" value="en-gb" /></jaxrs:languageMappings></jaxrs:server><!-- WebService 客户端 spring 配置文件cxf与Spring集成,cxf里提供了一个工厂类org.apache.cxf.jaxws.JaxWsProxyFactoryBean,可以方便实现的调用WebService。serviceClass属性是接口类,address是webService的路径在其他bean里如果要调用webservice,只要将client这个bean注入到需要使用的bean里。--><bean id="client" factory-bean="clientFactory" factory-method="create" /><bean id="clientFactory" value="com.exp.service.outer.HelloWorld" /><property name="address" value="http://localhost:8080/demo/webservice/HelloWorld" /></bean></beans>
?

?

注意:修改的代码如下:

?

<jaxws:endpoint id="helloWorld"  implementor="#HelloWorldImpl" address="/HelloWorld"  ><!-- 输入日志拦截器 -->   <jaxws:inInterceptors>      <ref bean="inMessageInterceptor"/>      <ref bean="helloInInterceptor"/>   </jaxws:inInterceptors>   <!-- 输出日志拦截器 -->   <jaxws:outInterceptors>      <ref bean="outMessageInterceptor"/>   </jaxws:outInterceptors>   <jaxws:properties>      <entry key="mtom_enabled" value="true"></entry>   </jaxws:properties>      <!--    <jaxws:features><bean name="code">public class HelloWorldFeature extends AbstractFeature {@Overrideprotected void initializeProvider(InterceptorProvider provider, Bus bus) {provider.getInInterceptors().add(new LoggingInInterceptor());provider.getInInterceptors().add(new HelloInInterceptor());provider.getOutInterceptors().add(new LoggingOutInterceptor());}}
?

?

?

?注意:能够看到通过HelloWorldFeature.java捆绑了三个拦截器。

?

2、在Spring对捆绑拦截器的配置

?

?

   <jaxws:endpoint id="helloWorld" implementor="#HelloWorldImpl" address="/HelloWorld" >  <jaxws:features><bean value="true"></entry>   </jaxws:properties>   </jaxws:endpoint>  
?

?

看到这里省掉了很多拦截器的配置代码,只需要一个 <jaxws:features>就搞定

?

?

?

?

?

热点排行