Apache cxf JaxRs基本应用

来源:互联网 发布:淘宝分销合作协议书 编辑:程序博客网 时间:2024/05/22 12:18

在前一篇中,我们完成了《Apache cxf JaxWs基本应用》 的编写,我们现在实现一个Restful风格的Cxf 。

一、我们首先依旧是基于Maven project配置pom.xml的依赖

[html] view plaincopyprint?
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  3.     <modelVersion>4.0.0</modelVersion>  
  4.     <artifactId>abc-api</artifactId>  
  5.     <packaging>war</packaging>  
  6.     <version>${global.version}</version>  
  7.       
  8.     <parent>  
  9.         <groupId>com.abc.module</groupId>  
  10.         <artifactId>abc-parent</artifactId>  
  11.         <version>0.0.1-SNAPSHOT</version>  
  12.     </parent>  
  13.       
  14.     <dependencies>  
  15.         <dependency>  
  16.             <groupId>javax.ws.rs</groupId>  
  17.             <artifactId>jsr311-api</artifactId>  
  18.             <version>1.1.1</version>  
  19.         </dependency>  
  20.         <dependency>  
  21.             <groupId>org.apache.cxf</groupId>  
  22.             <artifactId>cxf-rt-transports-http</artifactId>  
  23.             <version>2.6.1</version>  
  24.         </dependency>  
  25.         <dependency>  
  26.             <groupId>org.apache.cxf</groupId>  
  27.             <artifactId>cxf-rt-frontend-jaxws</artifactId>  
  28.             <version>2.6.1</version>  
  29.         </dependency>  
  30.         <dependency>  
  31.             <groupId>org.apache.cxf</groupId>  
  32.             <artifactId>cxf-rt-frontend-jaxrs</artifactId>  
  33.             <version>2.6.1</version>  
  34.         </dependency>  
  35.         <dependency>  
  36.             <groupId>org.codehaus.jettison</groupId>  
  37.             <artifactId>jettison</artifactId>  
  38.             <version>1.3.5</version>  
  39.         </dependency>  
  40.         <dependency>  
  41.             <groupId>axis</groupId>  
  42.             <artifactId>axis</artifactId>  
  43.             <version>1.4</version>  
  44.         </dependency>  
  45.         <dependency>  
  46.             <groupId>org.codehaus.woodstox</groupId>  
  47.             <artifactId>stax2-api</artifactId>  
  48.             <version>3.1.1</version>  
  49.         </dependency>  
  50.         <dependency>  
  51.             <groupId>org.jbarcode</groupId>  
  52.             <artifactId>jbarcode</artifactId>  
  53.             <version>0.2.8</version>  
  54.         </dependency>  
  55.     </dependencies>  
  56.   
  57.     <build>  
  58.         <finalName>${project.artifactId}</finalName>  
  59.     </build>  
  60. </project>  

二、配置web.xml

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xmlns="http://java.sun.com/xml/ns/javaee"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
  5.     id="WebApp_ID" version="2.5">  
  6.     <display-name>fsp-api</display-name>  
  7.     <context-param>  
  8.         <param-name>contextConfigLocation</param-name>  
  9.         <param-value>classpath*:application.xml</param-value>  
  10.     </context-param>  
  11.   
  12.     <!-- spring context listener -->  
  13.     <listener>  
  14.         <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>  
  15.     </listener>  
  16.     <listener>  
  17.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  18.     </listener>  
  19.   
  20.     <!-- CXF -->  
  21.     <servlet>  
  22.         <servlet-name>cxf</servlet-name>  
  23.         <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>  
  24.         <load-on-startup>1</load-on-startup>  
  25.     </servlet>  
  26.     <servlet-mapping>  
  27.         <servlet-name>cxf</servlet-name>  
  28.         <url-pattern>/services/*</url-pattern>  
  29.     </servlet-mapping>  
  30.       
  31. </web-app>  

三、创建Webservice对外接口

[java] view plaincopyprint?
  1. /** 
  2.  * Copyright (c) 2011-2014 All Rights Reserved. 
  3.  */  
  4. package com.abc.warehouse.service;  
  5.   
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8. import javax.ws.rs.GET;  
  9. import javax.ws.rs.POST;  
  10. import javax.ws.rs.Path;  
  11. import javax.ws.rs.PathParam;  
  12. import javax.ws.rs.Produces;  
  13. import javax.ws.rs.core.Context;  
  14. import javax.ws.rs.core.MediaType;  
  15.   
  16. @Path("/logisticsApi")  
  17. public interface ILogisticsApi {  
  18.   
  19.     @GET  
  20.     @Path("/doGet/{first}/{last}")  
  21.     @Produces(MediaType.APPLICATION_XML)  
  22.     public String doGet(@PathParam(value = "first") String firstName, @PathParam(value = "last") String lastName);  
  23.       
  24.       
  25.     @POST  
  26.     @Path("/itemConfirm")  
  27.     @Produces(MediaType.APPLICATION_XML)  
  28.     public String itemConfirm(String xmlParam,  
  29.                                     @Context HttpServletRequest servletRequest,   
  30.                                     @Context HttpServletResponse servletResponse);  
  31.   
  32. }  

四、实现Webservice接口

[java] view plaincopyprint?
  1. /** 
  2.  * Copyright (c) 2011-2014 All Rights Reserved. 
  3.  */  
  4. package com.abc.api.service;  
  5.   
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8.   
  9. import org.slf4j.Logger;  
  10. import org.slf4j.LoggerFactory;  
  11.   
  12. import com.abc.warehouse.service.ILogisticsApi;  
  13.   
  14.   
  15. public class LogisticsApiImpl implements ILogisticsApi {  
  16.   
  17.     private Logger log = LoggerFactory.getLogger(getClass());  
  18.       
  19.     /**  
  20.      * @see com.abc.warehouse.service.ILogisticsApi#itemConfirm(java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 
  21.      */  
  22.     @Override  
  23.     public String itemConfirm(String xmlParam,  
  24.                                     HttpServletRequest servletRequest,   
  25.                                     HttpServletResponse servletResponse) {  
  26.         // TODO Auto-generated method stub  
  27.         // to do something ...  
  28.   
  29.         return response;  
  30.     }  
  31.   
  32.   
  33.     /**  
  34.      * @see com.abc.warehouse.service.ILogisticsApi#doGet(java.lang.String, java.lang.String) 
  35.      */  
  36.     @Override  
  37.     public String doGet(String firstName, String lastName) {  
  38.         // TODO Auto-generated method stub  
  39.         log.debug("doGet : " + firstName + ", lastName : " + lastName);  
  40.         // to to something ...  
  41.   
  42.         return response;  
  43.     }  
  44.   
  45.   
  46.   
  47. }  

五、配置Spring xml,让Webservice提供服务

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  4.     xmlns:jaxws="http://cxf.apache.org/jaxws"  
  5.     xmlns:jaxrs="http://cxf.apache.org/jaxrs"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  7.                        http://www.springframework.org/schema/beans/spring-beans.xsd  
  8.                        http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd  
  9.                     http://cxf.apache.org/jaxrs  
  10.                     http://cxf.apache.org/schemas/jaxrs.xsd">  
  11.   
  12.     <import resource="classpath:META-INF/cxf/cxf.xml" />  
  13.     <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />  
  14.     <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />  
  15.   
  16.     <bean id="encodingLoggingInInterceptor" class="com.abc.api.util.EncodingLoggingInInterceptor"/>  
  17.     <bean id="outLoggingInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>  
  18.     <bean id="logisticsApi" class="com.abc.api.service.LogisticsApiImpl"/>  
  19.     <jaxrs:server id="logisticsApiServiceContainer">  
  20.         <jaxrs:serviceBeans>  
  21.             <ref bean="logisticsApi" />  
  22.         </jaxrs:serviceBeans>  
  23.           
  24.         <jaxrs:inInterceptors>  
  25.             <ref bean="encodingLoggingInInterceptor"/>  
  26.         </jaxrs:inInterceptors>  
  27.         <jaxrs:outInterceptors>  
  28.             <ref bean="outLoggingInterceptor"/>  
  29.         </jaxrs:outInterceptors>  
  30.           
  31.         <jaxrs:extensionMappings>  
  32.             <!-- <entry key="json" value="application/json" /> -->  
  33.             <entry key="xml" value="application/xml" />  
  34.         </jaxrs:extensionMappings>  
  35.       
  36.         <jaxrs:languageMappings>  
  37.             <entry key="en" value="en-gb"/>    
  38.         </jaxrs:languageMappings>  
  39.     </jaxrs:server>  
  40.   
  41. </beans>  

其中EncodingLoggingInInterceptor类主要是为了解决传输内容在LoggingInInterceptor类内构建并输出时的乱码问题

[java] view plaincopyprint?
  1. /** 
  2.  * Copyright (c) 2011-2014 All Rights Reserved. 
  3.  */  
  4. package com.abc.api.util;  
  5.   
  6. import org.apache.cxf.interceptor.Fault;  
  7. import org.apache.cxf.interceptor.LoggingInInterceptor;  
  8. import org.apache.cxf.message.Message;  
  9. import org.slf4j.Logger;  
  10. import org.slf4j.LoggerFactory;  
  11.   
  12.   
  13. public class EncodingLoggingInInterceptor extends LoggingInInterceptor {  
  14.   
  15.     private Logger log = LoggerFactory.getLogger(getClass());  
  16.       
  17.     /** 
  18.      *  
  19.      */  
  20.     public EncodingLoggingInInterceptor() {  
  21.         // TODO Auto-generated constructor stub  
  22.         super();  
  23.     }  
  24.       
  25.     /**  
  26.      * @see org.apache.cxf.interceptor.LoggingInInterceptor#handleMessage(org.apache.cxf.message.Message) 
  27.      */  
  28.     @Override  
  29.     public void handleMessage(Message message) throws Fault {  
  30.         // TODO Auto-generated method stub  
  31.           
  32.         String encoding = System.getProperty("file.encoding");  
  33.         encoding = encoding == null || encoding.equals("") ? "UTF-8" : encoding;  
  34.           
  35.         log.debug("encoding : " + encoding);  
  36.         message.put(Message.ENCODING, encoding);  
  37.           
  38.         super.handleMessage(message);  
  39.     }  
  40. }  

至此,Webservice服务器端代码已经编写完成,假设Maven project名字为abc-api,那么访问该Webservice接口的地址为:http://ip:port/abc-api/services/


六、接下来我们编写一个基于WebClient简单客户端

[java] view plaincopyprint?
  1. /** 
  2.  * Copyright (c) 2011-2014 All Rights Reserved. 
  3.  */  
  4. package com.abc.api.service;  
  5.   
  6. import static org.junit.Assert.*;  
  7.   
  8. import javax.ws.rs.core.MediaType;  
  9.   
  10. import org.apache.cxf.jaxrs.client.WebClient;  
  11. import org.junit.After;  
  12. import org.junit.Before;  
  13. import org.junit.Test;  
  14.   
  15.   
  16. public class LogisticsApiTester {  
  17.   
  18.     private WebClient client;  
  19.     private String baseAddress = "http://localhost:8080/abc-api/services/logisticsApi";  
  20.     /** 
  21.      *  
  22.      * @throws java.lang.Exception 
  23.      */  
  24.     @Before  
  25.     public void setUp() throws Exception {  
  26.         client = WebClient.create(baseAddress)  
  27.             .header("charset""UTF-8")  
  28.             .encoding("UTF-8")  
  29.             .acceptEncoding("UTF-8");  
  30.     }  
  31.   
  32.     /** 
  33.      *  
  34.      * @throws java.lang.Exception 
  35.      */  
  36.     @After  
  37.     public void tearDown() throws Exception {  
  38.         client = null;  
  39.     }  
  40.   
  41.     /** 
  42.      * Test method for {@link com.abc.api.service.LogisticsApiImpl#itemConfirm(java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)}. 
  43.      */  
  44.     @Test  
  45.     public void testItemConfirm() {  
  46.         //fail("Not yet implemented");  
  47.           
  48.         Object xmlParam = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"  
  49.             + "<itemName>诺基亚</itemName>";  
  50.         String responseMessage = client.path("itemConfirm")  
  51.                                         .accept(MediaType.APPLICATION_XML)  
  52.                                         .post(xmlParam, String.class);  
  53.         System.out.println("responseMessage : " + responseMessage);  
  54.         assertNotEquals(responseMessage, null);  
  55.     }  
  56.   
  57.     /** 
  58.      * Test method for {@link com.abc.api.service.LogisticsApiImpl#doGet(java.lang.String, java.lang.String)}. 
  59.      */  
  60.     @Test  
  61.     public void testDoGet() {  
  62.         //fail("Not yet implemented");  
  63.           
  64.         String responseString = client.path("doGet/{first}/{last}"12)  
  65.                                     .accept(MediaType.APPLICATION_XML)  
  66.                                     .get(String.class);  
  67.         assertNotEquals(responseString, null);  
  68.     }  
  69.   
  70.   
  71. }  


到这里我们就完成了基于Apache cxf JaxRs的服务端和客户端的Demo编写。


0 0