码迷,mamicode.com
首页 > Web开发 > 详细

Apache cxf JaxRs基本应用

时间:2015-09-13 12:06:07      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:

在前一篇中,我们完成了《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编写。



Apache cxf JaxRs基本应用

标签:

原文地址:http://my.oschina.net/sniperLi/blog/505471

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!