Apache cxf JaxRs基本应用
2019獨角獸企業重金招聘Python工程師標準>>>
在前一篇中,我們完成了《Apache cxf JaxWs基本應用》 的編寫,我們現在實現一個Restful風格的Cxf 。
一、我們首先依舊是基于Maven project配置pom.xml的依賴
[html] view plaincopyprint?
<project?xmlns="http://maven.apache.org/POM/4.0.0"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
????xsi:schemaLocation="http://maven.apache.org/POM/4.0.0?http://maven.apache.org/xsd/maven-4.0.0.xsd">??
????<modelVersion>4.0.0</modelVersion>??
????<artifactId>abc-api</artifactId>??
????<packaging>war</packaging>??
????<version>${global.version}</version>??
??????
????<parent>??
????????<groupId>com.abc.module</groupId>??
????????<artifactId>abc-parent</artifactId>??
????????<version>0.0.1-SNAPSHOT</version>??
????</parent>??
??????
????<dependencies>??
????????<dependency>??
????????????<groupId>javax.ws.rs</groupId>??
????????????<artifactId>jsr311-api</artifactId>??
????????????<version>1.1.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-jaxws</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.codehaus.jettison</groupId>??
????????????<artifactId>jettison</artifactId>??
????????????<version>1.3.5</version>??
????????</dependency>??
????????<dependency>??
????????????<groupId>axis</groupId>??
????????????<artifactId>axis</artifactId>??
????????????<version>1.4</version>??
????????</dependency>??
????????<dependency>??
????????????<groupId>org.codehaus.woodstox</groupId>??
????????????<artifactId>stax2-api</artifactId>??
????????????<version>3.1.1</version>??
????????</dependency>??
????????<dependency>??
????????????<groupId>org.jbarcode</groupId>??
????????????<artifactId>jbarcode</artifactId>??
????????????<version>0.2.8</version>??
????????</dependency>??
????</dependencies>??
??
????<build>??
????????<finalName>${project.artifactId}</finalName>??
????</build>??
</project>??
二、配置web.xml
[html] view plaincopyprint?
<?xml?version="1.0"?encoding="UTF-8"?>??
<web-app?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
????xmlns="http://java.sun.com/xml/ns/javaee"??
????xsi:schemaLocation="http://java.sun.com/xml/ns/javaee?http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"??
????id="WebApp_ID"?version="2.5">??
????<display-name>fsp-api</display-name>??
????<context-param>??
????????<param-name>contextConfigLocation</param-name>??
????????<param-value>classpath*:application.xml</param-value>??
????</context-param>??
??
????<!--?spring?context?listener?-->??
????<listener>??
????????<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>??
????</listener>??
????<listener>??
????????<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>??
????</listener>??
??
????<!--?CXF?-->??
????<servlet>??
????????<servlet-name>cxf</servlet-name>??
????????<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>??
????????<load-on-startup>1</load-on-startup>??
????</servlet>??
????<servlet-mapping>??
????????<servlet-name>cxf</servlet-name>??
????????<url-pattern>/services/*</url-pattern>??
????</servlet-mapping>??
??????
</web-app>??
三、創建Webservice對外接口
[java] view plaincopyprint?
/**?
?*?Copyright?(c)?2011-2014?All?Rights?Reserved.?
?*/??
package?com.abc.warehouse.service;??
??
import?javax.servlet.http.HttpServletRequest;??
import?javax.servlet.http.HttpServletResponse;??
import?javax.ws.rs.GET;??
import?javax.ws.rs.POST;??
import?javax.ws.rs.Path;??
import?javax.ws.rs.PathParam;??
import?javax.ws.rs.Produces;??
import?javax.ws.rs.core.Context;??
import?javax.ws.rs.core.MediaType;??
??
@Path ("/logisticsApi")??
public?interface?ILogisticsApi?{??
??
????@GET ??
????@Path ("/doGet/{first}/{last}")??
????@Produces(MediaType.APPLICATION_XML)??
????public?String?doGet(@PathParam(value?=?"first")?String?firstName,?@PathParam(value?=?"last")?String?lastName);??
??????
??????
????@POST??
????@Path("/itemConfirm")??
????@Produces(MediaType.APPLICATION_XML)??
????public?String?itemConfirm(String?xmlParam,??
????????????????????????????????????@Context?HttpServletRequest?servletRequest,???
????????????????????????????????????@Context?HttpServletResponse?servletResponse);??
??
}??
四、實現Webservice接口
[java] view plaincopyprint?
/**?
?*?Copyright?(c)?2011-2014?All?Rights?Reserved.?
?*/??
package?com.abc.api.service;??
??
import?javax.servlet.http.HttpServletRequest;??
import?javax.servlet.http.HttpServletResponse;??
??
import?org.slf4j.Logger;??
import?org.slf4j.LoggerFactory;??
??
import?com.abc.warehouse.service.ILogisticsApi;??
??
??
public?class?LogisticsApiImpl?implements?ILogisticsApi?{??
??
????private?Logger?log?=?LoggerFactory.getLogger(getClass());??
??????
????/**??
?????*?@see?com.abc.warehouse.service.ILogisticsApi#itemConfirm(java.lang.String,?javax.servlet.http.HttpServletRequest,?javax.servlet.http.HttpServletResponse)?
?????*/??
????@Override??
????public?String?itemConfirm(String?xmlParam,??
????????????????????????????????????HttpServletRequest?servletRequest,???
????????????????????????????????????HttpServletResponse?servletResponse)?{??
????????//?TODO?Auto-generated?method?stub??
????????//?to?do?something?...??
??
????????return?response;??
????}??
??
??
????/**??
?????*?@see?com.abc.warehouse.service.ILogisticsApi#doGet(java.lang.String,?java.lang.String)?
?????*/??
????@Override??
????public?String?doGet(String?firstName,?String?lastName)?{??
????????//?TODO?Auto-generated?method?stub??
????????log.debug("doGet?:?"?+?firstName?+?",?lastName?:?"?+?lastName);??
????????//?to?to?something?...??
??
????????return?response;??
????}??
??
??
??
}??
五、配置Spring xml,讓Webservice提供服務
[html] view plaincopyprint?
<?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.xsd??
????????????????????http://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="encodingLoggingInInterceptor"?class="com.abc.api.util.EncodingLoggingInInterceptor"/>??
????<bean?id="outLoggingInterceptor"?class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>??
????<bean?id="logisticsApi"?class="com.abc.api.service.LogisticsApiImpl"/>??
????<jaxrs:server?id="logisticsApiServiceContainer">??
????????<jaxrs:serviceBeans>??
????????????<ref?bean="logisticsApi"?/>??
????????</jaxrs:serviceBeans>??
??????????
????????<jaxrs:inInterceptors>??
????????????<ref?bean="encodingLoggingInInterceptor"/>??
????????</jaxrs:inInterceptors>??
????????<jaxrs:outInterceptors>??
????????????<ref?bean="outLoggingInterceptor"/>??
????????</jaxrs:outInterceptors>??
??????????
????????<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>??
其中EncodingLoggingInInterceptor類主要是為了解決傳輸內容在LoggingInInterceptor類內構建并輸出時的亂碼問題
[java] view plaincopyprint?
/**?
?*?Copyright?(c)?2011-2014?All?Rights?Reserved.?
?*/??
package?com.abc.api.util;??
??
import?org.apache.cxf.interceptor.Fault;??
import?org.apache.cxf.interceptor.LoggingInInterceptor;??
import?org.apache.cxf.message.Message;??
import?org.slf4j.Logger;??
import?org.slf4j.LoggerFactory;??
??
??
public?class?EncodingLoggingInInterceptor?extends?LoggingInInterceptor?{??
??
????private?Logger?log?=?LoggerFactory.getLogger(getClass());??
??????
????/**?
?????*??
?????*/??
????public?EncodingLoggingInInterceptor()?{??
????????//?TODO?Auto-generated?constructor?stub??
????????super();??
????}??
??????
????/**??
?????*?@see?org.apache.cxf.interceptor.LoggingInInterceptor#handleMessage(org.apache.cxf.message.Message)?
?????*/??
????@Override??
????public?void?handleMessage(Message?message)?throws?Fault?{??
????????//?TODO?Auto-generated?method?stub??
??????????
????????String?encoding?=?System.getProperty("file.encoding");??
????????encoding?=?encoding?==?null?||?encoding.equals("")???"UTF-8"?:?encoding;??
??????????
????????log.debug("encoding?:?"?+?encoding);??
????????message.put(Message.ENCODING,?encoding);??
??????????
????????super.handleMessage(message);??
????}??
}??
至此,Webservice服務器端代碼已經編寫完成,假設Maven project名字為abc-api,那么訪問該Webservice接口的地址為:http://ip:port/abc-api/services/
六、接下來我們編寫一個基于WebClient簡單客戶端
[java] view plaincopyprint?
/**?
?*?Copyright?(c)?2011-2014?All?Rights?Reserved.?
?*/??
package?com.abc.api.service;??
??
import?static?org.junit.Assert.*;??
??
import?javax.ws.rs.core.MediaType;??
??
import?org.apache.cxf.jaxrs.client.WebClient;??
import?org.junit.After;??
import?org.junit.Before;??
import?org.junit.Test;??
??
??
public?class?LogisticsApiTester?{??
??
????private?WebClient?client;??
????private?String?baseAddress?=?"http://localhost:8080/abc-api/services/logisticsApi";??
????/**?
?????*??
?????*?@throws?java.lang.Exception?
?????*/??
????@Before??
????public?void?setUp()?throws?Exception?{??
????????client?=?WebClient.create(baseAddress)??
????????????.header("charset",?"UTF-8")??
????????????.encoding("UTF-8")??
????????????.acceptEncoding("UTF-8");??
????}??
??
????/**?
?????*??
?????*?@throws?java.lang.Exception?
?????*/??
????@After??
????public?void?tearDown()?throws?Exception?{??
????????client?=?null;??
????}??
??
????/**?
?????*?Test?method?for?{@link?com.abc.api.service.LogisticsApiImpl#itemConfirm(java.lang.String,?javax.servlet.http.HttpServletRequest,?javax.servlet.http.HttpServletResponse)}.?
?????*/??
????@Test??
????public?void?testItemConfirm()?{??
????????//fail("Not?yet?implemented");??
??????????
????????Object?xmlParam?=?"<?xml?version=\"1.0\"?encoding=\"UTF-8\"?>"??
????????????+?"<itemName>諾基亞</itemName>";??
????????String?responseMessage?=?client.path("itemConfirm")??
????????????????????????????????????????.accept(MediaType.APPLICATION_XML)??
????????????????????????????????????????.post(xmlParam,?String.class);??
????????System.out.println("responseMessage?:?"?+?responseMessage);??
????????assertNotEquals(responseMessage,?null);??
????}??
??
????/**?
?????*?Test?method?for?{@link?com.abc.api.service.LogisticsApiImpl#doGet(java.lang.String,?java.lang.String)}.?
?????*/??
????@Test??
????public?void?testDoGet()?{??
????????//fail("Not?yet?implemented");??
??????????
????????String?responseString?=?client.path("doGet/{first}/{last}",?1,?2)??
????????????????????????????????????.accept(MediaType.APPLICATION_XML)??
????????????????????????????????????.get(String.class);??
????????assertNotEquals(responseString,?null);??
????}??
??
??
}??
到這里我們就完成了基于Apache cxf JaxRs的服務端和客戶端的Demo編寫。
轉載于:https://my.oschina.net/sniperLi/blog/505471
總結
以上是生活随笔為你收集整理的Apache cxf JaxRs基本应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: XCopy命令实现增量备份
- 下一篇: Can’t Activate Repor