CXF学习笔记三(发布restFul)

2023-11-15

一、概述

JAX-RS是Java提供用于开发RESTful Web服务基于注解(annotation)的API。JAX-RS旨在定义一个统一的规范,使得Java程序员可以使用一套固定的接口来开发REST应用,避免了依赖第三方框架。同时JAX-RS使用POJO编程模型和基于注解的配置并集成JAXB,可以有效缩短REST应用的开发周期。JAX-RS只定义RESTful API,具体实现由第三方提供,如Jersey、Apache CXF等。

JAX-RS包含近五十多个接口、注解和抽象类:

javax.ws.rs包含用于创建RESTful服务资源的高层次(High-level)接口和注解。

javax.ws.rs.core包含用于创建RESTful服务资源的低层次(Low-level)接口和注解。

javax.ws.rs.ext包含用于扩展JAX-RS API支持类型的APIs。

JAX-RS常用注解:

@Path:标注资源类或方法的相对路径。

@GET、@PUT、@POST、@DELETE:标注方法的HTTP请求类型。

@Produces:标注返回的MIME媒体类型。

@Consumes:标注可接受请求的MIME媒体类型。

@PathParam、@QueryParam、@HeaderParam、@CookieParam、@MatrixParam、@FormParam:标注方法的参数来自于HTTP请求的位置。@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,@HeaderParam来自于HTTP请求的头信息,@CookieParam来自于HTTP请求的Cookie。

二、依赖JAR文件Maven坐标

Java代码 

收藏代码

  1. <properties>  
  2.         <cxf.version>3.0.7</cxf.version>  
  3.         <junit.version>4.11</junit.version>  
  4.     </properties>  
  5. <!-- CXF需要导入的jar包 -->  
  6.         <dependency>  
  7.             <groupId>org.apache.cxf</groupId>  
  8.             <artifactId>cxf-rt-frontend-jaxws</artifactId>  
  9.             <version>${cxf.version}</version>  
  10.         </dependency>  
  11.   
  12.         <dependency>  
  13.             <groupId>org.apache.cxf</groupId>  
  14.             <artifactId>cxf-rt-transports-http</artifactId>  
  15.             <version>${cxf.version}</version>  
  16.         </dependency>  
  17.         <!-- CXF实现RestFul接口需要用到的包 -->  
  18.         <dependency>  
  19.             <groupId>org.apache.cxf</groupId>  
  20.             <artifactId>cxf-rt-frontend-jaxrs</artifactId>  
  21.             <version>${cxf.version}</version>  
  22.         </dependency>  
  23.         <!-- 客户端调用restFul服务需要导入的包 -->  
  24.         <dependency>  
  25.             <groupId>org.apache.cxf</groupId>  
  26.             <artifactId>cxf-rt-rs-client</artifactId>  
  27.             <version>${cxf.version}</version>  
  28.         </dependency>  
  29.   
  30.         <!-- 部署至tomcat低下不会,jetty环境需要加入该包 -->  
  31.         <dependency>  
  32.             <groupId>org.apache.cxf</groupId>  
  33.             <artifactId>cxf-rt-transports-http-jetty</artifactId>  
  34.             <version>${cxf.version}</version>  
  35.         </dependency>  

三、发布RestFul接口

3.1实体对象

Java代码 

收藏代码

  1. /** 
  2.  * @author Ickes 
  3.  */  
  4. @XmlRootElement(name="UserInfo")  
  5. public class Users{  
  6.     private String userId;  
  7.     private String userName;  
  8.     private String userPwd;  
  9.     private Integer sex;  
  10.     private Float sal;  
  11.     private Date birthday;  
  12.          
  13.         get、set方法省略!  
  14.          
  15.     public String toJson() {  
  16.         Gson gson = new Gson();  
  17.         return gson.toJson(this);  
  18.     }  
  19. }  

3.2、定义发布接口

Java代码 

收藏代码

  1. import javax.ws.rs.DELETE;  
  2. import javax.ws.rs.GET;  
  3. import javax.ws.rs.POST;  
  4. import javax.ws.rs.PUT;  
  5. import javax.ws.rs.Path;  
  6. import javax.ws.rs.PathParam;  
  7. import javax.ws.rs.Produces;  
  8. import javax.ws.rs.QueryParam;  
  9. import javax.ws.rs.core.MediaType;  
  10.   
  11. /** 
  12.  * 用户服务接口 
  13.  * @author Ickes 
  14.  */  
  15. @Path("/restFul")  
  16. public interface UserService {  
  17.     /** 
  18.      * 测试GET方法,传人对象、普通参数;返回对象 
  19.      *  
  20.      */  
  21.     @GET  
  22.     @Path("/get")  
  23.     @Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})  
  24.     public Users get(@QueryParam("id") String id);  
  25.       
  26.       
  27.     /** 
  28.      * 测试PUT方法,传人对象、普通参数;返回对象 
  29.      * id来源于url后面的参数 
  30.      * @param user 
  31.      * @return 
  32.      */  
  33.     @PUT  
  34.     @Path("/put/{id}")  
  35.     @Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})  
  36.     public Users put(@PathParam("id")String id,Users u);  
  37.       
  38.       
  39.     /** 
  40.      * 测试POST方法,传人对象、普通参数;返回对象 
  41.      *  
  42.      */  
  43.     @POST  
  44.     @Path("/post/{id}")  
  45.     @Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})  
  46.     public Users post(@PathParam("id") String id,Users u);  
  47.       
  48.       
  49.     /** 
  50.      * 测试DELETE方法 ,传人普通参数;返回对象 
  51.      */  
  52.     @DELETE  
  53.     @Path("/delete/{id}")  
  54.     @Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})  
  55.     public Users delete(@PathParam("id") String id);  
  56.       
  57. }  

3.3、接口实现类

Java代码 

收藏代码

  1. import java.util.Date;  
  2. import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;  
  3. import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;  
  4.   
  5. /** 
  6.  * 用户服务实现类 
  7.  *  
  8.  * @author Ickes 
  9.  */  
  10. public class UserServiceRestFul implements UserService {  
  11.   
  12.     @Override  
  13.     public Users get(String id) {  
  14.         System.out.println("GET方法,id=" + id);  
  15.         Users user = new Users();  
  16.         user.setUserId("get");  
  17.         user.setUserName("ickes");  
  18.         user.setUserPwd("ices123");  
  19.         user.setSex(1);  
  20.         user.setSal(32F);  
  21.         user.setBirthday(new Date());  
  22.         return user;  
  23.     }  
  24.   
  25.     @Override  
  26.     public Users put(String id, Users u) {  
  27.         System.out.println("PUT方法,id=" + id + ",users=" + u.toJson());  
  28.         Users user = new Users();  
  29.         user.setUserId("put");  
  30.         user.setUserName("ickes");  
  31.         user.setUserPwd("ices123");  
  32.         user.setSex(1);  
  33.         user.setSal(32F);  
  34.         user.setBirthday(new Date());  
  35.         return user;  
  36.     }  
  37.   
  38.     @Override  
  39.     public Users post(String id, Users u) {  
  40.         System.out.println("POST方法,id=" + id + ",users=" + u.toJson());  
  41.         Users user = new Users();  
  42.         user.setUserId("post");  
  43.         user.setUserName("ickes");  
  44.         user.setUserPwd("ices123");  
  45.         user.setSex(1);  
  46.         user.setSal(32F);  
  47.         user.setBirthday(new Date());  
  48.         return user;  
  49.     }  
  50.   
  51.     @Override  
  52.     public Users delete(String id) {  
  53.         System.out.println("DELETE方法,id=" + id);  
  54.         Users user = new Users();  
  55.         user.setUserId("delete");  
  56.         user.setUserName("ickes");  
  57.         user.setUserPwd("ices123");  
  58.         user.setSex(1);  
  59.         user.setSal(32F);  
  60.         user.setBirthday(new Date());  
  61.         return user;  
  62.     }  
  63. }  

四、发布RestFul接口

4.1、使用CXF的API接口进行发布

使用CXF的API接口进行发布的缺点很明显,就是必须指定一个端口进行发布,这个端口不能被占用,占用就会抛出异常。

Java代码 

收藏代码

  1. /** 
  2.  * 使用CXF发布RestFul服务 
  3.  *  
  4.  * @param args 
  5.  */  
  6. public static void main(String[] args) {  
  7.     JAXRSServerFactoryBean jrf = new JAXRSServerFactoryBean();  
  8.     jrf.setResourceClasses(UserServiceRestFul.class);  
  9.     jrf.setResourceProvider(UserServiceRestFul.class,  
  10.             new SingletonResourceProvider(new UserServiceRestFul()));  
  11.     jrf.setAddress("http://localhost:8080/rest/");  
  12.     jrf.create();  
  13. }  

4.2、在spring容器中进行发布

跟使用CXF发布JAX-WS接口一样,首先必须在web.xml中配置CXFWebServlet,代码如下:

Java代码 

收藏代码

  1. <!-- Cxf中使用 CXFServlet,发布跟当前项目端口相同的服务 -->  
  2.     <servlet>  
  3.         <servlet-name>cxfServlet</servlet-name>  
  4.         <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>  
  5.     </servlet>  
  6.     <servlet-mapping>  
  7.         <servlet-name>cxfServlet</servlet-name>  
  8.         <url-pattern>/cxf/*</url-pattern>  
  9.     </servlet-mapping>  

 然后在类路径下面新建applicationContext-cxf.xml,代码如下:

Java代码 

收藏代码

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:jaxrs="http://cxf.apache.org/jaxrs"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
  6.     http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd   
  7.     http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd ">  
  8.   
  9.     <jaxrs:server id="restUserService" address="/restFul">  
  10.         <jaxrs:serviceBeans>  
  11.             <ref bean="userServiceRestFul" />  
  12.         </jaxrs:serviceBeans>  
  13.         <jaxrs:extensionMappings>  
  14.             <entry key="json" value="application/json" />  
  15.             <entry key="xml" value="application/xml" />  
  16.         </jaxrs:extensionMappings>  
  17.     </jaxrs:server>  
  18.     <bean id="userServiceRestFul" class="com.gosun.jws.cxf.restful.UserServiceRestFul"></bean>  
  19. </beans>  

发布后在浏览器中输入http://localhost:8080/jws/cxf,出现如下见面说明发布成功.


 

五、客户端调用

5.1、使用WebClient进行调用(不推荐)

使用org.apache.cxf.jaxrs.client.WebClient调用的代码如下:

Java代码 

收藏代码

  1. import javax.ws.rs.core.MediaType;  
  2. import org.apache.cxf.jaxrs.client.WebClient;  
  3. import org.junit.Before;  
  4. import org.junit.Test;  
  5.   
  6. /** 
  7.  * @author Ickes 
  8.  */  
  9.   
  10. public class WebClientTest {  
  11.   
  12.     WebClient client = null;  
  13.   
  14.     @Before  
  15.     public void init() {  
  16.         client = WebClient.create("http://localhost:8080/rest/");  
  17.     }  
  18.   
  19.     /** 
  20.      * 调用get方法,get方式是将参数加入到URL地址后面的,所以不能传人Bean,但是可以转换为json的格式进行传递 
  21.      *  
  22.      * @param client 
  23.      */  
  24.     @Test  
  25.     public void getTest() {  
  26.         // 测试URL传递数据  
  27.         client = WebClient  
  28.                 .create("http://localhost:8080/rest/restFul/get?id=ickes");  
  29.         Users u = client.accept(MediaType.APPLICATION_XML).get(Users.class);  
  30.         System.out.println(u.toJson());  
  31.     }  
  32.   
  33.     /** 
  34.      * 调用put方法,可以看到这种方式可以传人一个JavaBean参数, 但是集合对象不行,可以将集合写在JavaBean里面进行传递 
  35.      */  
  36.     @Test  
  37.     public void putTest() {  
  38.         Users u = new Users();  
  39.         u.setUserId("1");  
  40.         u.setUserName("aa");  
  41.         u.setUserPwd("bbb");  
  42.         client.path("restFul/put/{id}", "ickes")  
  43.                 .accept(MediaType.APPLICATION_XML).put(u);  
  44.     }  
  45.   
  46.     /** 
  47.      * 调用post方法,这种方式的调用跟put方式异曲同工 
  48.      *  
  49.      */  
  50.     @Test  
  51.     public void postTest() {  
  52.         Users u = new Users();  
  53.         u.setUserId("1");  
  54.         u.setUserName("aa");  
  55.         u.setUserPwd("bbb");  
  56.         client.accept(MediaType.APPLICATION_XML)  
  57.                 .path("/restFul/post/{id}", "post").post(u);  
  58.     }  
  59.   
  60.     /** 
  61.      * 调用Delete方法,这个方法可以看到delete方法是不能传递参数的,只能通过其他方式,例如URL 
  62.      *  
  63.      */  
  64.     @Test  
  65.     public void deleteTest() {  
  66.         client.accept(MediaType.APPLICATION_XML)  
  67.                 .path("/restFul/delete/{id}", "post").delete();  
  68.     }  
  69. }  

5.2、使用CXF的客户端工厂类JAXRSClientFactory进行调用(推荐)

这种方式相对比WebClient要更简单,直接使用接口中的方法即可,代码如下:

Java代码 

收藏代码

  1. import org.apache.cxf.jaxrs.client.JAXRSClientFactory;  
  2. import org.junit.Before;  
  3. import org.junit.Test;  
  4.   
  5. /** 
  6.  * <pre> 
  7.  * 调用RestFul接口,除了使用WebClient意外,还可以使用org.apache.cxf.jaxrs.client.JAXRSClientFactory; 
  8.  * 这种方式相对比WebClient要更简单,直接使用接口中的方法即可 
  9.  * </pre> 
  10.  *  
  11.  * @author Ickes 
  12.  */  
  13. public class JAXRSClientFactoryTest {  
  14.     UserService us = null;  
  15.   
  16.     @Before  
  17.     public void init() {  
  18.         us = JAXRSClientFactory.create("http://localhost:8080/jws/cxf/restFul",UserService.class);  
  19.         System.out.println(us);  
  20.     }  
  21.   
  22.     /** 
  23.      * 调用get方法 
  24.      */  
  25.     @Test  
  26.     public void getTest() {  
  27.         System.out.println(us.get("a").toJson());  
  28.     }  
  29.   
  30.     /** 
  31.      * 调用put方法 
  32.      */  
  33.     @Test  
  34.     public void putTest() {  
  35.         Users u = new Users();  
  36.         u.setUserId("1");  
  37.         u.setUserName("aa");  
  38.         u.setUserPwd("bbb");  
  39.         System.out.println(us.post("a001",u));  
  40.     }  
  41.       
  42.     /** 
  43.      * 调用post方法 
  44.      *  
  45.      */  
  46.     @Test  
  47.     public void postTest() {  
  48.         Users u = new Users();  
  49.         u.setUserId("1");  
  50.         u.setUserName("aa");  
  51.         u.setUserPwd("bbb");  
  52.         us.post("POST", u);  
  53.     }  
  54.       
  55.     /** 
  56.      * 调用Delete方法 
  57.      *  
  58.      */  
  59.     @Test  
  60.     public void deleteTest() {  
  61.         us.delete("DELETE");  
  62.     }  
  63.       
  64. }  

如果想在Spring配置文件中配置org.apache.cxf.jaxrs.client.JAXRSClientFactory,代码如下:

Java代码 

收藏代码

  1. <bean id="userService" class="org.apache.cxf.jaxrs.client.JAXRSClientFactory" factory-method="create">  
  2.         <constructor-arg type="java.lang.String" value="http://localhost:8080/rest/" />  
  3.         <constructor-arg type="java.lang.Class" value="com.gosun.jws.cxf.restful.UserService" />  
  4.     </bean>  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CXF学习笔记三(发布restFul) 的相关文章

随机推荐

  • 在C语言中 ¬∧∨这些符号什么意思

    b b b a a a b a a 或运算是 a b a b b b a a a 这三个都是位运算 是取非运算 交你个小窍门 没啥子好多的了 好好看看 里面有详细的解释 这就是在逻辑运算中常用到的短路判断 ls的已经说的很清楚了 b a b
  • 微信小程序之首页搭建

    小程序开发与实战 学习视频 https www bilibili com video BV1Gv411g7j6 p 9 spm id from pageDriver 实现导航栏和tabBar 实现导航栏和tabBar tabBar看下图 参
  • 电荷泵

    电荷泵 又称为电容式的开关稳压器 或开关电容DC DC变换器 无感式DC DC变换器 电荷泵采用电容作为开关和储能的元件 如图所示 S1与S3闭合 S2与S4断开 则Vin给电容充电 而后S1与S3断开 S2与S4闭合 则电容放电 此时Vo
  • Virtual Judge-4099:队列和栈

    Virtual Judge 4099 队列和栈 题目描述 队列和栈是两种重要的数据结构 它们具有push k和pop操作 push k是将数字k加入到队列或栈中 pop则是从队列和栈取一个数出来 队列和栈的区别在于取数的位置是不同的 队列是
  • PyTorch入门(六)使用Transformer模型进行中文文本分类

    在文章PyTorch入门 五 使用CNN模型进行中文文本分类中 笔者介绍了如何在PyTorch中使用CNN模型进行中文文本分类 本文将会使用Transformer模型实现中文文本分类 本文将会使用相同的数据集 文本预处理已经在文章PyTor
  • C语言程序——用星号打印图案

    文章目录 前言 一 用星号打印图案 二 程序实例 1 程序代码 2 运行结果 3 结果分析 三 拓展应用 总结 前言 用打印字符来输出星号组成的HELLO 一 用星号打印图案 用星号打印图案 一般利用星号画出具体的模拟输出形式 然后在输出时
  • 【Android】常用对话框大全(一)Android Dialog

    Android的对话框有多少种 Android好看的对话框有很多 如Android material qmui xui kongzue等系列对话框 但博主只打算讲解Android material系列对话框 讲太多没必要 实在想要做成人家那
  • 千万级数据清洗ETL设计方案

    千万级数据清洗项目分析总结 项目简介 一 需求分析 1 前期需求 2 中期需求 3 后期需求 二 技术支持 1 MySQL 2 Redis 三 框架设计 1 流线型代码 2 工厂模式 四 调式工作 1 线上测试 五 问题回顾 1 Mysql
  • scratch python的区别ev3_机器人编程和少儿编程,傻傻分不清—乐高EV3入门感想

    机器人编程和少儿编程的区别 机器人编程和少儿编程不是一个概念 机器人编程是少儿编程的重要组成部分 少儿学习编程大体上是两种方式 1 纯软件 最具代表性的是scratch 是麻省理工学院专门针对小朋友研发的图形化编程语言 无需英文和代码基础
  • win7系统扩展双屏幕时,如何在两个屏幕下都显示任务栏

    扩展屏幕下都显示任务栏 win7系统本身无法设置该功能 目前我是不知道 但可以下载第三方软件来解决该问题 第一步 Dual Monitor Taskbar 下载软件 下载链接 http pan baidu com s 1o61isjw 密码
  • Web 浏览器演变史

    浏览器的演变是由梦想和创新编织而成的 Tim Bernas Lee 在80年代在CERN工作时 提出了HTML技术 用以改善CERN庞大的信息管理需求 Tim 也编写了第一款浏览器 它是基于NeXT提供的interface builder开
  • 【STM32学习笔记】(7)——STM32时钟系统详解

    STM32时钟系统 时钟系统的简介 RCC Reset Clock Control 复位和时钟控制器 时钟是单片机运行的基础 时钟信号推动单片机内各个部分执行相应的指令 时钟系统就是CPU的脉搏 决定cpu速率 像人的心跳一样 只有有了心跳
  • 深度优先搜索(DFS) 广度优先搜索(BFS)

    深度优先搜索算法 Depth First Search DFS是搜索算法的一种 它沿着树的深度遍历树的节点 尽可能深的搜索树的分支 当节点v的所有边都己被探寻过 搜索将回溯到发现节点v的那条边的起始节点 这一过程一直进行到已发现从源节点可达
  • 软件系统产品线特征及构建过程

    根据SEI定义 结合业界的一些研究 软件产品线有如下几个重要特征 1 一个软件产品线应该有一系列的产品成员组成 既产品家族 2 产品家族中的所有产品都服务于一些特定的领域 3 产品家族成员之间在服务功能 产品质量 产品性能 产品应用范围等方
  • Kotlin协程概览

    协程 Coroutines 并不是 Kotlin 提出来的新概念 很多的编程语言都有实现 如 Go Python 等 本文所讲 专指kotlin的协程 在Android 11中 Asynctask已经被废弃了 因为协程可以更简单 直观的实现
  • (管用)Sqlite数据库升级

    调用构造器DBHelper中super里面的方法 增大newVersion的值 就会自动执行onUpgrade 增加数据库字段的sql语句 String upgradeGoods alter table Person add column
  • matlab 里tic toc的用法,Matlab中tic和toc用法

    简单地说 tic和toc是用来记录matlab命令执行的时间 tic用来保存当前时间 而后使用toc来记录程序完成时间 两者往往结合使用 用法如下 tic operations toc 显示时间单位 秒 Tic和toc函数可以计算运行一段时
  • 微信小程序的简单开发案例(记事本)

    微信小程序案例之简单记事本实现 我最近在学习微信小程序 主要熟悉了微信开发者工具的简单使用以及小程序的开发流程 微信小程序的学习要求不高 只要有一些web前端等知识基础即可 1 小程序简介 微信小程序是一种不用下载就能使用的应用 也是一项创
  • vant2-上拉加载、下拉刷新

    可以使用vant组件库实现 上拉刷新 下拉加载功能 vant2开发指南 htt ps youzan github io vant v2 zh CN list 上拉加载 List列表
  • CXF学习笔记三(发布restFul)

    一 概述 JAX RS是Java提供用于开发RESTful Web服务基于注解 annotation 的API JAX RS旨在定义一个统一的规范 使得Java程序员可以使用一套固定的接口来开发REST应用 避免了依赖第三方框架 同时JAX