一、简介

  资源驱动。基于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. 查看Linux中自带的jdk ,设置JAVA_HOME

    在配置hadoop是,进行格式化hadoop的时候,出现找不到jdk 我用centos7是64位的, 发现本机有java ,就找了一下其位置 找到了jdk-1.7.0_75 which java [r ...

  2. hdu2008 数值统计【C++】

    数值统计 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  3. 【codeforces 510B】Fox And Two Dots

    [题目链接]:http://codeforces.com/contest/510/problem/B [题意] 让你在一个二维的方格里面找环; 两个点有相邻的边它们才是相连的; 有环YES,没环NO ...

  4. C# WPF 窗体传递消息

    对于存在窗体的WPF程序(或者说,起码在任务栏上有个图标,即ShowInTaskbar = true),互相传递消息是很容易的. 步骤: 1,寻找窗体的句柄 2,运用windows API: Send ...

  5. N天学习一个linux命令之kill

    用途 用于终止进程 用法 kill [-s signal|-p] [--] pid... kill -l [signal] 说明 1.默认发送信号15(请求终止进程,程序可以捕获,操作系统会杀死没有对 ...

  6. ZPush--基于netty4实现的苹果通知推送服务(APNs)Javaclient

    简单说下实现苹果通知推送服务(APNs)client的一些要注意的地方: 使用长连接: sanboxserver是无用的,调试时直接用"gateway.push.apple.com" ...

  7. Android使用GestureDetector实现手势滑动效果

    直接看实例: package com.example.gesturedetector; import android.os.Bundle; import android.app.Activity; i ...

  8. AFNetworking 3.0携带參数上传文件Demo

    一.服务端代码: 服务端是java用国产nutz搞的,实际mvc框架都大同小异.就是提交文件的同一时候还带了个表单參数 @AdaptBy(type=UploadAdaptor.class, args= ...

  9. 历届试题 邮局(dfs+剪枝)

      历届试题 邮局   时间限制:1.0s   内存限制:256.0MB      问题描述 C村住着n户村民,由于交通闭塞,C村的村民只能通过信件与外界交流.为了方便村民们发信,C村打算在C村建设k ...

  10. 【HDU 3663】 Power Stations

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3663 [算法] 先建图,然后用Dancing Links求解精确覆盖,即可 [代码] #inclu ...