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 ...
随机推荐
- Android第三方开源图片裁剪截取:cropper
Android第三方开源图片裁剪截取:cropper 很多app都需要裁剪截取图片作为头像.logo之类,而cropper是github上的一个针对Android平台的.第三方开源图片裁剪截取项 ...
- 浅析gcc、arm-linux-gcc和arm-elf-gcc关系
浅析gcc.arm-linux-gcc和arm-elf-gcc关系 一.GCC简介 The GNU Compiler Collection,通常简称 GCC,是一套由 GNU 开发的编译器集,为什么是 ...
- hdu_1003_Max Sum_201311271630
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- 实现MVC.NET 5的国际化
实现国际化有三种做法: 创建资源文件. 每种语言设置一套单独的View. 1 + 2. 通常而言,第一种方法的可维护性是最高的.因为随着项目的规模的扩大,为每种语言设置一套单独的View,前期的工作量 ...
- Openfire:重新配置openfire
有些时候当我们在对openfire开发时,需要重置openfire的配置,这时最简单的方法就是重新运行openfire的安装程序.要重新运行安装程序,方法很简单: 打开openfire的安装目录,找到 ...
- Struts 配置文件
web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="htt ...
- bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 数位DP...东看西看:http://www.cnblogs.com/Artanis/ ...
- Cash Machine(多重背包)
http://poj.org/problem?id=1276 #include <stdio.h> #include <string.h> ; #define Max(a,b) ...
- jdbc数据库中的增删改
HttpSession session=request.getSession(); session.setAttribute("currentUser",u.username);/ ...
- Rancher 2:添加 NFS client provisioner 动态提供 Kubernetes 后端存储卷
一.前提说明 1.说明: NFS client provisioner 利用 NFS Server 给 Kubernetes 作为持久存储的后端,并且动态提供PV. 默认 rancher 2 的存储类 ...