2019独角兽企业重金招聘Python工程师标准>>>

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

  8. <groupId>com.abc.module</groupId>

  9. <artifactId>abc-parent</artifactId>

  10. <version>0.0.1-SNAPSHOT</version>

  11. </parent>

  12. <dependencies>

  13. <dependency>

  14. <groupId>javax.ws.rs</groupId>

  15. <artifactId>jsr311-api</artifactId>

  16. <version>1.1.1</version>

  17. </dependency>

  18. <dependency>

  19. <groupId>org.apache.cxf</groupId>

  20. <artifactId>cxf-rt-transports-http</artifactId>

  21. <version>2.6.1</version>

  22. </dependency>

  23. <dependency>

  24. <groupId>org.apache.cxf</groupId>

  25. <artifactId>cxf-rt-frontend-jaxws</artifactId>

  26. <version>2.6.1</version>

  27. </dependency>

  28. <dependency>

  29. <groupId>org.apache.cxf</groupId>

  30. <artifactId>cxf-rt-frontend-jaxrs</artifactId>

  31. <version>2.6.1</version>

  32. </dependency>

  33. <dependency>

  34. <groupId>org.codehaus.jettison</groupId>

  35. <artifactId>jettison</artifactId>

  36. <version>1.3.5</version>

  37. </dependency>

  38. <dependency>

  39. <groupId>axis</groupId>

  40. <artifactId>axis</artifactId>

  41. <version>1.4</version>

  42. </dependency>

  43. <dependency>

  44. <groupId>org.codehaus.woodstox</groupId>

  45. <artifactId>stax2-api</artifactId>

  46. <version>3.1.1</version>

  47. </dependency>

  48. <dependency>

  49. <groupId>org.jbarcode</groupId>

  50. <artifactId>jbarcode</artifactId>

  51. <version>0.2.8</version>

  52. </dependency>

  53. </dependencies>

  54. <build>

  55. <finalName>${project.artifactId}</finalName>

  56. </build>

  57. </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. <!-- spring context listener -->

  12. <listener>

  13. <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>

  14. </listener>

  15. <listener>

  16. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

  17. </listener>

  18. <!-- CXF -->

  19. <servlet>

  20. <servlet-name>cxf</servlet-name>

  21. <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

  22. <load-on-startup>1</load-on-startup>

  23. </servlet>

  24. <servlet-mapping>

  25. <servlet-name>cxf</servlet-name>

  26. <url-pattern>/services/*</url-pattern>

  27. </servlet-mapping>

  28. </web-app>

三、创建Webservice对外接口

[java] view plaincopyprint?

  1. /**

  2. * Copyright (c) 2011-2014 All Rights Reserved.

  3. */

  4. package com.abc.warehouse.service;

  5. import javax.servlet.http.HttpServletRequest;

  6. import javax.servlet.http.HttpServletResponse;

  7. import javax.ws.rs.GET;

  8. import javax.ws.rs.POST;

  9. import javax.ws.rs.Path;

  10. import javax.ws.rs.PathParam;

  11. import javax.ws.rs.Produces;

  12. import javax.ws.rs.core.Context;

  13. import javax.ws.rs.core.MediaType;

  14. @Path ("/logisticsApi")

  15. public interface ILogisticsApi {

  16. @GET

  17. @Path ("/doGet/{first}/{last}")

  18. @Produces(MediaType.APPLICATION_XML)

  19. public String doGet(@PathParam(value = "first") String firstName, @PathParam(value = "last") String lastName);

  20. @POST

  21. @Path("/itemConfirm")

  22. @Produces(MediaType.APPLICATION_XML)

  23. public String itemConfirm(String xmlParam,

  24. @Context HttpServletRequest servletRequest,

  25. @Context HttpServletResponse servletResponse);

  26. }

四、实现Webservice接口

[java] view plaincopyprint?

  1. /**

  2. * Copyright (c) 2011-2014 All Rights Reserved.

  3. */

  4. package com.abc.api.service;

  5. import javax.servlet.http.HttpServletRequest;

  6. import javax.servlet.http.HttpServletResponse;

  7. import org.slf4j.Logger;

  8. import org.slf4j.LoggerFactory;

  9. import com.abc.warehouse.service.ILogisticsApi;

  10. public class LogisticsApiImpl implements ILogisticsApi {

  11. private Logger log = LoggerFactory.getLogger(getClass());

  12. /**

  13. * @see com.abc.warehouse.service.ILogisticsApi#itemConfirm(java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)

  14. */

  15. @Override

  16. public String itemConfirm(String xmlParam,

  17. HttpServletRequest servletRequest,

  18. HttpServletResponse servletResponse) {

  19. // TODO Auto-generated method stub

  20. // to do something ...

  21. return response;

  22. }

  23. /**

  24. * @see com.abc.warehouse.service.ILogisticsApi#doGet(java.lang.String, java.lang.String)

  25. */

  26. @Override

  27. public String doGet(String firstName, String lastName) {

  28. // TODO Auto-generated method stub

  29. log.debug("doGet : " + firstName + ", lastName : " + lastName);

  30. // to to something ...

  31. return response;

  32. }

  33. }

五、配置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. <import resource="classpath:META-INF/cxf/cxf.xml" />

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

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

  14. <bean id="encodingLoggingInInterceptor" class="com.abc.api.util.EncodingLoggingInInterceptor"/>

  15. <bean id="outLoggingInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>

  16. <bean id="logisticsApi" class="com.abc.api.service.LogisticsApiImpl"/>

  17. <jaxrs:server id="logisticsApiServiceContainer">

  18. <jaxrs:serviceBeans>

  19. <ref bean="logisticsApi" />

  20. </jaxrs:serviceBeans>

  21. <jaxrs:inInterceptors>

  22. <ref bean="encodingLoggingInInterceptor"/>

  23. </jaxrs:inInterceptors>

  24. <jaxrs:outInterceptors>

  25. <ref bean="outLoggingInterceptor"/>

  26. </jaxrs:outInterceptors>

  27. <jaxrs:extensionMappings>

  28. <!-- <entry key="json" value="application/json" /> -->

  29. <entry key="xml" value="application/xml" />

  30. </jaxrs:extensionMappings>

  31. <jaxrs:languageMappings>

  32. <entry key="en" value="en-gb"/>

  33. </jaxrs:languageMappings>

  34. </jaxrs:server>

  35. </beans>

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

[java] view plaincopyprint?

  1. /**

  2. * Copyright (c) 2011-2014 All Rights Reserved.

  3. */

  4. package com.abc.api.util;

  5. import org.apache.cxf.interceptor.Fault;

  6. import org.apache.cxf.interceptor.LoggingInInterceptor;

  7. import org.apache.cxf.message.Message;

  8. import org.slf4j.Logger;

  9. import org.slf4j.LoggerFactory;

  10. public class EncodingLoggingInInterceptor extends LoggingInInterceptor {

  11. private Logger log = LoggerFactory.getLogger(getClass());

  12. /**

  13. *

  14. */

  15. public EncodingLoggingInInterceptor() {

  16. // TODO Auto-generated constructor stub

  17. super();

  18. }

  19. /**

  20. * @see org.apache.cxf.interceptor.LoggingInInterceptor#handleMessage(org.apache.cxf.message.Message)

  21. */

  22. @Override

  23. public void handleMessage(Message message) throws Fault {

  24. // TODO Auto-generated method stub

  25. String encoding = System.getProperty("file.encoding");

  26. encoding = encoding == null || encoding.equals("") ? "UTF-8" : encoding;

  27. log.debug("encoding : " + encoding);

  28. message.put(Message.ENCODING, encoding);

  29. super.handleMessage(message);

  30. }

  31. }

至此,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. import static org.junit.Assert.*;

  6. import javax.ws.rs.core.MediaType;

  7. import org.apache.cxf.jaxrs.client.WebClient;

  8. import org.junit.After;

  9. import org.junit.Before;

  10. import org.junit.Test;

  11. public class LogisticsApiTester {

  12. private WebClient client;

  13. private String baseAddress = "http://localhost:8080/abc-api/services/logisticsApi";

  14. /**

  15. *

  16. * @throws java.lang.Exception

  17. */

  18. @Before

  19. public void setUp() throws Exception {

  20. client = WebClient.create(baseAddress)

  21. .header("charset", "UTF-8")

  22. .encoding("UTF-8")

  23. .acceptEncoding("UTF-8");

  24. }

  25. /**

  26. *

  27. * @throws java.lang.Exception

  28. */

  29. @After

  30. public void tearDown() throws Exception {

  31. client = null;

  32. }

  33. /**

  34. * Test method for {@link com.abc.api.service.LogisticsApiImpl#itemConfirm(java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)}.

  35. */

  36. @Test

  37. public void testItemConfirm() {

  38. //fail("Not yet implemented");

  39. Object xmlParam = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"

  40. + "<itemName>诺基亚</itemName>";

  41. String responseMessage = client.path("itemConfirm")

  42. .accept(MediaType.APPLICATION_XML)

  43. .post(xmlParam, String.class);

  44. System.out.println("responseMessage : " + responseMessage);

  45. assertNotEquals(responseMessage, null);

  46. }

  47. /**

  48. * Test method for {@link com.abc.api.service.LogisticsApiImpl#doGet(java.lang.String, java.lang.String)}.

  49. */

  50. @Test

  51. public void testDoGet() {

  52. //fail("Not yet implemented");

  53. String responseString = client.path("doGet/{first}/{last}", 1, 2)

  54. .accept(MediaType.APPLICATION_XML)

  55. .get(String.class);

  56. assertNotEquals(responseString, null);

  57. }

  58. }

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

转载于:https://my.oschina.net/sniperLi/blog/505471

Apache cxf JaxRs基本应用相关推荐

  1. Apache CXF实现Web Service(3)——Tomcat容器和不借助Spring的普通Servlet实现JAX-RS(RESTful) web service...

    起步 参照这一系列的另外一篇文章: Apache CXF实现Web Service(2)--不借助重量级Web容器和Spring实现一个纯的JAX-RS(RESTful) web service 首先 ...

  2. jax-ws cxf_走向REST:在Spring和JAX-RS(Apache CXF)中嵌入Jetty

    jax-ws cxf 对于服务器核心Java开发人员来说,向世界"展示"的唯一方法是使用API​​. 今天的帖子都是关于JAX-RS的 :使用Java编写和公开RESTful服务. ...

  3. 超越JAX-RS规范:Apache CXF搜索扩展

    在今天的帖子中,我们将超越JAX-RS 2.0规范,并探索Apache CXF (流行的JAX-RS 2.0实现之一)为REST服务和API开发人员提供的有用扩展. 特别是,我们将讨论使用OData ...

  4. Apache CXF 3.0:JAX-RS 2.0和Bean验证1.1最终一起

    即将发布的出色的Apache CXF框架3.0版 (当前处于里程碑2阶段)带来了许多有趣且有用的功能,越来越接近提供完整的JAX-RS 2.0支持. Bean Validation 1.1的支持是我们 ...

  5. 走向REST:在Spring和JAX-RS(Apache CXF)中嵌入Jetty

    对于服务器核心Java开发人员而言,向世界"展示"的唯一方法是使用API​​. 今天的帖子都是关于JAX-RS的 :使用Java编写和公开RESTful服务. 但是,我们不会使用涉 ...

  6. jetty嵌入式容器_嵌入式Jetty和Apache CXF:借助Spring Security来保护REST服务

    jetty嵌入式容器 最近,我遇到了一个非常有趣的问题,我认为这只需要几分钟就可以解决:在Linux中使用Spring Security (当前稳定版本3.2.5 )保护Apache CXF (当前版 ...

  7. 嵌入式Jetty和Apache CXF:借助Spring Security来保护REST服务

    最近,我遇到了一个非常有趣的问题,我认为这只花了我几分钟就解决了:在Windows Server 2003中使用Spring Security (当前稳定版本3.2.5 )保护Apache CXF ( ...

  8. Apache CXF - 快速指南

    Apache CXF - 简介 在当今的环境中,您可以使用多个选项来创建 Web 服务应用程序.您可以使用多种标准和广泛接受的协议中的一种或多种进行通信.例如SOAP.XML/HTTP.RESTful ...

  9. jax-ws cxf_走向REST:将Tomcat嵌入Spring和JAX-RS(Apache CXF)

    jax-ws cxf 这篇文章是上一篇文章的逻辑延续. 唯一的区别是我们将使用的容器:它将是我们的老兄Apache Tomcat而不是Jetty . 令人惊讶的是,嵌入最新的Apache Tomcat ...

最新文章

  1. python各个解释器的用途-常用的五种Python解释器|老男孩网络Python学习课程
  2. 在Asp.net页面中实现数据饼图
  3. ConcurrentHashMap 1.8 源码分析
  4. Tomcat部署时没有项目
  5. UFT开发实例:QTP调用OutLook自动发送邮件
  6. Codeforces Round #364 (Div. 1) 700B(树)
  7. php随机生成卡密,PHP随机生成不反复的8位卡号(数字)和卡密(字符串)_后端开发...
  8. 免费股票量化交易软件有哪些?
  9. send()、sendto()和recv()、recvfrom()的使用
  10. xp计算机找不到音量调节,电脑音量图标消失无法调整声音大小的解决方案
  11. [漏洞分析] CVE-2021-3560 PolKit条件竞争本地提权分析
  12. html5 jq切换效果,jquery中实现标签切换效果的代码
  13. 青少年计算机编程少儿编程小学生编程是否适合
  14. 证件照制作:使用PS打印一寸照片
  15. 2020.12.04 常用Linux命令
  16. 如何把一张图片放到网页上或者如何在浏览器查看一张图片
  17. 大数据在金融行业的应用有哪些
  18. 小程序中如何使用Emoji表情
  19. java项目疑难解答_Tivoli Kernel Services 疑难解答
  20. LPDDR5 之Link ECC

热门文章

  1. markdown格式_第1篇:如何将Markdown笔记转入ANKI复习? | 学习骇客
  2. html标记的索引,基于HTML标记分析及中文切词的网页索引研究与实现
  3. 物理搬砖问题_全职业通用,搬砖市场装备
  4. archives_do.php,织梦后台文章管理中增加批量添加tag标签功能
  5. 湖南省普通高等学校计算机应用水平,湖南省普通高等学校非计算机专业学生计算机应用水平二级考试大纲...
  6. linux var 空间不足,/var空间不足怎么办?(求安全保险的方法)
  7. 类型全部为string_python小讲堂丨学了这么久的,这6种基本数据类型你真的理解了吗...
  8. 《软件项目管理(第二版)》第 7 章——项目风险管理 重点部分总结
  9. Hibernate的数据删除,更改
  10. python 求出4行5列的二维数组周边元素之和