CXF-JAX-RS开发(一)入门案例
一、简介
资源驱动。基于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开发(一)入门案例的更多相关文章
- WebService基础入门 CXF(WS + RS)
一.基本介绍 Web Services是一个软件接口,它描述了一组可以在网络上通过标准化的 XML 消息传递访问的操作.它使用基于 XML 语言的协议来描述要执行的操作或者要与另一个 Web 服务交换 ...
- CXF-JAX-WS开发(一)入门案例
一.Web Service 1.定义 W3C定义,Web服务(Web service)应当是一个软件系统,用以支持网络间不同机器的互动操作. 2.作用 多系统间数据通信 二.CXF是什么? CXF是目 ...
- Django 入门案例开发(上)
Django 入门案例开发(中) http://www.cnblogs.com/focusBI/p/7858267.html Django是一个重量级的web开发框架,它提供了很多内部已开发好的插件供 ...
- Django 入门案例开发
Django是一个重量级的web开发框架,它提供了很多内部已开发好的插件供我们使用:这里不去描述 Django直接进入开发过程. Django入门案例分两部分:一.开发环境的配置:二.业务需求分析. ...
- Java开发学习(十五)----AOP入门案例及其工作流程解析
一.AOP简介 1.1 什么是AOP AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构. OOP(Object Oriented ...
- Java开发学习(二十三)----SpringMVC入门案例、工作流程解析及设置bean加载控制
一.SpringMVC概述 SpringMVC是隶属于Spring框架的一部分,主要是用来进行Web开发,是对Servlet进行了封装.SpringMVC是处于Web层的框架,所以其主要的作用就是用来 ...
- Java开发学习(四十)----MyBatisPlus入门案例与简介
一.入门案例 MybatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发.提供效率. SpringBoot它能快速构建Spring开发环境用以整合其他技术,使用起来 ...
- Java开发学习(二)----IOC、DI入门案例
一.IOC入门案例 1.1 思路分析 (1)Spring是使用容器来管理bean对象的,那么管什么? 主要管理项目中所使用到的类对象,比如(Service和Dao) (2)如何将被管理的对象告知IOC ...
- SpringMVC入门案例及请求流程图(关于处理器或视图解析器或处理器映射器等的初步配置)
SpringMVC简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 Spring结构图 Spr ...
随机推荐
- Cookie的Python爬虫应用
Cookie的Python爬虫应用 目录 Cookie是什么 Cookie的作用 Cookie的内容 domain属性 path属性 expires/Max-Age属性 Cookie的爬虫应用 Coo ...
- Codeforces Round #411(Div. 2)——ABCDEF
30min水掉前面4T,30min尝试读懂EF题,60min划水 顺便D忘记取膜丢50分,距比赛结束10s时hack失败丢50分... 从2620掉分到2520,从rank227掉到rank354.. ...
- Linux学习总结(13)——在阿里云的ubuntu上部署个人服务
作为一个IT界的人,一般都希望有一个独立的博客,或者一部独立的机器.所以我一直在找机会,拥有一台自己可以独立控制的机器,自己想干嘛干嘛.当然这在虚拟机或者自己的PC上面也可以实现,但是这跟一台一直开着 ...
- Divisible Group Sums
Divisible Group Sums Given a list of N numbers you will be allowed to choose any M of them. So you c ...
- noip模拟赛 计数
[问题描述] 给出m个数a[1],a[2],…,a[m] 求1~n中有多少数不是a[1],a[2],…,a[m]的倍数. [输入] 输入文件名为count.in. 第一行,包含两个整数:n,m 第二行 ...
- dinic算法求最大流的学习
http://trp.jlu.edu.cn/software/net/lssx/4/4.38.htm http://www.cnblogs.com/zen_chou/archive/0001/01/0 ...
- Void 参数
在C程序中如果在声明函数的时候如果没有任何参数那么需要将参数定义为void以此来限定此函数不可传递任何参数,如果不进行限定让参数表默认为空其意义是可以传递任何参数,这个问题的由来实际上是由于要兼容早期 ...
- SecureCRT 的使用技巧
SecureCRT 支持 SSH1,SSH2,Telnet,RLogin,Serial,和 TAPI 协议, 一般用来登录Linux服务器进行跨系统操作,也可代替 超级终端,进行串口 调试. 1.串口 ...
- hdu_1009_FatMouse' Trade_201310280910
FatMouse' Trade http://acm.hdu.edu.cn/showproblem.php?pid=1009 Time Limit: 2000/1000 MS (Java/Others ...
- 51Nod——T 1109 01组成的N的倍数
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1109 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 ...