一、简介

  资源驱动。基于HTTP协议[按照标准指定URL,就可以访问数据]以XML|JSON格式传输数据。

二、quickstart

  1、创建maven project[Packaging:jar]

    

    

  2、导入依赖

 <!-- CXF的rs开发 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 内置jetty的web服务器 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>

  3、搭建服务端

    3.1、导入实体bean

      

      参考CXF-JAX-WS开发(一)入门案例,2.4.1、导入实体bean目录下的实体类Car.java和User.java

    3.2、构建服务bean

      3.2.1、IUserService.java     

 package org.cxf_rs.service;

 import java.util.List;
import org.cxf_rs.domain.User; public interface IUserService {
//增
public void saveUser(User user);
//删
public void deleteUser(Integer id);
//改
public void updateUser(User user);
//查-查询所有
public List<User> findAllUsers();
//查-根据id查询
public User finUserById(Integer id);
}

      3.2.2、UserServiceImpl.java

 package org.cxf_rs.service;

 import java.util.ArrayList;
import java.util.List; import org.cxf_rs.domain.Car;
import org.cxf_rs.domain.User; public class UserServiceImpl implements IUserService {
//增
public void saveUser(User user) {
System.out.println("save user:" + user);
}
//删
public void deleteUser(Integer id) {
System.out.println("delete user id :" + id);
}
//改
public void updateUser(User user) {
System.out.println("update user:" + user);
}
//查-查询所有
public List<User> findAllUsers() {
List<User> users = new ArrayList<User>();
User user1 = new User();
user1.setId(1);
user1.setUsername("小明");
user1.setCity("北京"); List<Car> carList1 = new ArrayList<Car>();
Car car1 = new Car();
car1.setId(101);
car1.setCarName("保时捷");
car1.setPrice(1000000d);
carList1.add(car1);
Car car2 = new Car();
car2.setId(102);
car2.setCarName("宝马");
car2.setPrice(400000d);
carList1.add(car2);
user1.setCars(carList1); users.add(user1); User user2 = new User();
user2.setId(2);
user2.setUsername("小丽");
user2.setCity("上海");
users.add(user2); return users;
}
//查-根据id查询
public User finUserById(Integer id) {
if (id == 1) {
User user1 = new User();
user1.setId(1);
user1.setUsername("小明");
user1.setCity("北京");
return user1;
}
return null;
}
}

    3.3、添加注解

      3.3.1、domain[加@XmlRootElement注解]

        

        

      未加的话报如下错误:

        

      3.3.2、service

        ①常用注解

  

        ②IUserService.java带注解 

 package org.cxf_rs.service;

 import java.util.List;

 import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces; import org.cxf_rs.domain.User; @Path("/userService")
@Produces("*/*")
public interface IUserService {
//增
@POST
@Path("/user")
@Consumes({ "application/xml", "application/json" })
public void saveUser(User user);
//删
@DELETE
@Path("/user/{id}")
@Consumes("application/xml")
public void deleteUser(@PathParam("id") Integer id);
//改
@PUT
@Path("/user")
@Consumes({ "application/xml", "application/json" })
public void updateUser(User user);
//查-查询所有
@GET
@Path("/user")
@Produces({ "application/xml", "application/json" })
public List<User> findAllUsers();
//查-根据id查询
@GET
@Path("/user/{id}")
@Consumes("application/xml")
@Produces({ "application/xml", "application/json" })
public User finUserById(@PathParam("id") Integer id);
}

  4、发布服务

 package org.cxf_rs.server;

 import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.cxf_rs.domain.Car;
import org.cxf_rs.domain.User;
import org.cxf_rs.service.IUserService;
import org.cxf_rs.service.UserServiceImpl; public class JAX_RS_Server {
public static void main(String[] args) {
// 创建业务接口实现类对象
IUserService userService = new UserServiceImpl();
// 服务器FactoryBean创建服务
JAXRSServerFactoryBean restServer = new JAXRSServerFactoryBean();
restServer.setResourceClasses(User.class, Car.class);
restServer.setServiceBean(userService);
restServer.setAddress("http://localhost:9999/");
// 打印日志
restServer.getInInterceptors().add(new LoggingInInterceptor());
restServer.getOutInterceptors().add(new LoggingOutInterceptor());
// 发布服务
restServer.create();
System.out.println("服务器启动成功!");
}
}

  5、客户端测试

    5.1、浏览器测试

      5.1.1、查询所有

        查询所有:http://localhost:9999/userService/user

          

      5.1.2、根据id查询

        根据id查询:http://localhost:9999/userService/user/1

        

    5.2、WebClient 工具类[CXF 自带的工具包]

      5.2.1、导入依赖

 <!-- 导入CXF-Client依赖 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-client</artifactId>
<version>3.0.1</version>
</dependency>

      5.2.2、目录结构

        

      5.2.3、JAX_RS_Client.java

        ① 测试新增   

 // 测试新增
@Test
public void test_save(){
/**
* create :建立与调用服务资源路径连接
* path :访问服务器的路径--->@Path
* type :发送给服务器数据格式--->@Consumes
* accept :接收服务器传输数据格式--->@Produces
*/
User user = new User();
user.setId(3);
user.setUsername("小美");
user.setCity("深圳");
WebClient.create("http://localhost:9999/").path("userService/user").type(MediaType.APPLICATION_JSON).post(user);
}

        

        ②测试删除  

 // 测试删除
@Test
public void test_delete(){
/**
* create :建立与调用服务资源路径连接
* path :访问服务器的路径--->@Path
* type :发送给服务器数据格式--->@Consumes
* accept :接收服务器传输数据格式--->@Produces
*/
// 删除
WebClient.create("http://localhost:9999/").path("userService/user/1").type(MediaType.APPLICATION_XML).delete();
}

      

        ③测试修改   

 // 测试修改
@Test
public void test_update(){
/**
* create :建立与调用服务资源路径连接
* path :访问服务器的路径--->@Path
* type :发送给服务器数据格式--->@Consumes
* accept :接收服务器传输数据格式--->@Produces
*/
User user = new User();
user.setId(3);
user.setUsername("小美");
user.setCity("深圳");
// 修改
WebClient.create("http://localhost:9999/").path("userService/user").type(MediaType.APPLICATION_JSON).put(user);
}

      

        ④测试查询所有

 // 测试查询所有
@Test
public void test_findAll() {
/**
* create :建立与调用服务资源路径连接
* path :访问服务器的路径--->@Path
* type :发送给服务器数据格式--->@Consumes
* accept :接收服务器传输数据格式--->@Produces
*/
// 查询所有用户
Collection<? extends User> users = WebClient.create("http://localhost:9999/userService/user").accept(MediaType.APPLICATION_XML).getCollection(User.class);
System.out.println("查询所有用户" + users);
}

      

        ⑤测试根据id查询

 // 测试根据id查询
@Test
public void test_findById() {
/**
* create :建立与调用服务资源路径连接
* path :访问服务器的路径--->@Path
* type :发送给服务器数据格式--->@Consumes
* accept :接收服务器传输数据格式--->@Produces
*/
WebClient client = WebClient.create("http://localhost:9999/");
User responseUser = client.path("userService/user/1").accept(MediaType.APPLICATION_XML).get(User.class);
System.out.println("根据id查询" + responseUser);
}

      

      5.2.4、测试新增报异常

        ①异常描述

          Caused by: javax.ws.rs.ProcessingException: No message body writer has been found for class cn.itcast.cxf.domain.User, ContentType: application/json 

        ②出现原因

          测试时传输JSON格式的数据

        ③解决方案

         引入json转换器的依赖

 <!-- CXF的json转换器,拓展json -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 转换json的工具包,被cxf-rt-rs-extension-providers包依赖 -->
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.3.7</version>
</dependency>

CXF-JAX-RS开发(一)入门案例的更多相关文章

  1. WebService基础入门 CXF(WS + RS)

    一.基本介绍 Web Services是一个软件接口,它描述了一组可以在网络上通过标准化的 XML 消息传递访问的操作.它使用基于 XML 语言的协议来描述要执行的操作或者要与另一个 Web 服务交换 ...

  2. CXF-JAX-WS开发(一)入门案例

    一.Web Service 1.定义 W3C定义,Web服务(Web service)应当是一个软件系统,用以支持网络间不同机器的互动操作. 2.作用 多系统间数据通信 二.CXF是什么? CXF是目 ...

  3. Django 入门案例开发(上)

    Django 入门案例开发(中) http://www.cnblogs.com/focusBI/p/7858267.html Django是一个重量级的web开发框架,它提供了很多内部已开发好的插件供 ...

  4. Django 入门案例开发

    Django是一个重量级的web开发框架,它提供了很多内部已开发好的插件供我们使用:这里不去描述 Django直接进入开发过程. Django入门案例分两部分:一.开发环境的配置:二.业务需求分析. ...

  5. Java开发学习(十五)----AOP入门案例及其工作流程解析

    一.AOP简介 1.1 什么是AOP AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构. OOP(Object Oriented ...

  6. Java开发学习(二十三)----SpringMVC入门案例、工作流程解析及设置bean加载控制

    一.SpringMVC概述 SpringMVC是隶属于Spring框架的一部分,主要是用来进行Web开发,是对Servlet进行了封装.SpringMVC是处于Web层的框架,所以其主要的作用就是用来 ...

  7. Java开发学习(四十)----MyBatisPlus入门案例与简介

    一.入门案例 MybatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发.提供效率. SpringBoot它能快速构建Spring开发环境用以整合其他技术,使用起来 ...

  8. Java开发学习(二)----IOC、DI入门案例

    一.IOC入门案例 1.1 思路分析 (1)Spring是使用容器来管理bean对象的,那么管什么? 主要管理项目中所使用到的类对象,比如(Service和Dao) (2)如何将被管理的对象告知IOC ...

  9. SpringMVC入门案例及请求流程图(关于处理器或视图解析器或处理器映射器等的初步配置)

    SpringMVC简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 Spring结构图 Spr ...

随机推荐

  1. BZOJ 2501 [usaco2010 Oct]Soda Machine

    [题意概述] 给出一个[0,1,000,000,000]的整数数轴,刚开始每个位置都为0,有n个区间加操作,最后询问数轴上最大的数是多少. [题解] 我写的是离散化后线段树维护区间最值. 其实貌似不用 ...

  2. http长链接问题

    http://www.ibm.com/developerworks/cn/web/wa-lo-comet/

  3. Huawei-R&S-网络工程师实验笔记20190525-设备登录、VRP基本配置、文件系统

    >Huawei-R&S-网络工程师实验笔记20190525-设备登录.VRP基本配置.文件系统(环回接口.telnet远程.AAA登录.命令行.时钟.banner.文件目录) >& ...

  4. [luoguP2870] [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold(后缀数组)

    传送门 数据小的话贪心就行. 可以把这个串翻转再接到后面,再求后缀数组,求出 rank 数组就很简单了. ——代码 #include <cstdio> #include <iostr ...

  5. [bzoj1923]外星千足虫[高斯消元]

    高斯消元解异或方程组 #include <iostream> #include <algorithm> #include <cstdio> #include < ...

  6. imu 和 private redo

    在传统的undo管理模式中,Oracle对undo和data block是一视同仁.这样大致会有三种弊端: 1)事务开始时,存放事务表的段头不在内存,server process需要将此i/o上来 2 ...

  7. TDD尝试:nodejs单元测试

    单元测试是最小化的测试方式,也是TDD的做法. TDD概念如下图: 通过测试反馈推进开发,ruby是推崇这种编程方式的. nodejs有如下常用单元测试模块 1.mocha Mocha是一个基于nod ...

  8. vbs setkeys 特殊符号

    set keys={~}!^@^#^${%%}{^&^}{^^}{*}{(}{)}{_}{-}{=}{+}.;:'"

  9. springboot-quartz 实现动态添加,修改,删除,暂停,恢复等功能

    任务相关信息:springboot-quartz普通任务与可传参任务 一.任务实体类 package cloud.app.prod.home.quartz; import java.io.Serial ...

  10. luogu3834 【模板】可持久化线段树1(主席树)

    关键字:线段树 可持久化 线段树:当版本(即对应的原序列的区间[1,r])一定时,每个节点的left,right下标为值域,值为其对应的原序列区间[1,r]中元素大小在值域中的元素个数. 可持久化:新 ...