CXF-JAX-RS开发(一)入门案例

时间:2023-03-09 06:19:06
CXF-JAX-RS开发(一)入门案例

一、简介

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

二、quickstart

  1、创建maven project[Packaging:jar]

    CXF-JAX-RS开发(一)入门案例

    CXF-JAX-RS开发(一)入门案例

  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-RS开发(一)入门案例

      参考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注解]

        CXF-JAX-RS开发(一)入门案例

        CXF-JAX-RS开发(一)入门案例

      未加的话报如下错误:

        CXF-JAX-RS开发(一)入门案例

      3.3.2、service

        ①常用注解

  CXF-JAX-RS开发(一)入门案例

        ②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

          CXF-JAX-RS开发(一)入门案例

      5.1.2、根据id查询

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

        CXF-JAX-RS开发(一)入门案例

    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、目录结构

        CXF-JAX-RS开发(一)入门案例

      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);
}

        CXF-JAX-RS开发(一)入门案例

        ②测试删除  

 // 测试删除
@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();
}

      CXF-JAX-RS开发(一)入门案例

        ③测试修改   

 // 测试修改
@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);
}

      CXF-JAX-RS开发(一)入门案例

        ④测试查询所有

 // 测试查询所有
@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);
}

      CXF-JAX-RS开发(一)入门案例

        ⑤测试根据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);
}

      CXF-JAX-RS开发(一)入门案例

      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 

CXF-JAX-RS开发(一)入门案例

        ②出现原因

          测试时传输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>