resultful cxf 拦截器实践

一、mave配置

 <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-simple</artifactId>
            <version>2.6.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>2.6.1</version>
        </dependency>

    <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
            <version>2.6.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-rs-security-cors</artifactId>
            <version>2.6.1</version>
        </dependency>
        <!-- <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId>
            <version>3.0.4</version> </dependency> -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-rs-extension-providers</artifactId>
            <version>2.6.1</version>
        </dependency>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>jsr311-api</artifactId>
            <version>1.1.1</version>
        </dependency>

因为公司的jdk版本低所以使用的包版本较低

二、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" xmlns:cxf="http://cxf.apache.org/core"
    xsi:schemaLocation="http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
    default-autowire="byName" default-lazy-init="true">


    <description>Apache CXF的Web Service配置</description>

    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
    


    <!-- address-请求路径 -->

    <jaxrs:server id="kpiResource" address="/">

        <!-- 输入拦截器设置 -->

        <jaxrs:inInterceptors>
            <bean class="com.**.rs.security.KpiMessageInInterceptor" />
        </jaxrs:inInterceptors>

 

        <!-- 输出拦截器设置 -->

        <jaxrs:outInterceptors>
            <bean class="com.**.rs.security.KpiMessageOutInterceptor" />
        </jaxrs:outInterceptors>

 

        <!-- serviceBeans-暴露的WebService服务类 -->

          <jaxrs:serviceBeans>

             <ref bean="pointService" />
 
        </jaxrs:serviceBeans>
 
            <jaxrs:providers>
                 <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"></bean>
            </jaxrs:providers>


        <!-- 支持的协议 -->

        <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>
</beans>

三、代码

KpiMessageInInterceptor、KpiMessageOutInterceptor类都继 AbstractPhaseInterceptor<Message>

四、注意事项

1、web.xml 需加上 

<!-- CXF Servlet -->
    <servlet>
        <servlet-name>CXFService</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CXFService</servlet-name>
        <url-pattern>/rs/*</url-pattern>
    </servlet-mapping>

2、第二点spring配置中必须暴露服务,不然会报错

3、  拦截器实现类 中的重载方法

@Override
    public void handleMessage(Message message) throws Fault {}可以用

        //异常则直接返回
             if(null==request){
                  request=new MessageWrapper();
             }
                   Map<String,Object> reMap=new HashMap<String,Object>();
                   reMap.put("return_code", "1");
                   reMap.put("return_msg", e.getMessage());
                   
             try {  
                 HttpServletResponse response = (HttpServletResponse)message.get(AbstractHTTPDestination.HTTP_RESPONSE);  
                 ServletOutputStream out = response.getOutputStream();  
                 String outMsg = jsonMapper.writeValueAsString(reMap);               
                 request.setMessageBody(outMsg);
                 request.setSign(null);
                 outMsg=jsonMapper.writeValueAsString(request);
                 logger.info("回送字符串:" + outMsg);
                 out.write(outMsg.getBytes(CHAT_SET));  
                 out.flush();  
                 out.close();
                 message.getInterceptorChain().doInterceptStartingAfter(message, "org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor");  
             } catch (Exception ex) {  
                 throw new Fault(ex);
             } 
    方式直接返回结果,不抛出异常,直接抛出异常直接返回异常xml不是json

转载于:https://my.oschina.net/xiaoyaoyoufang/blog/895909

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值