zoukankan      html  css  js  c++  java
  • CXF-JAX-RS开发(一)入门案例

    一、简介

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

    二、quickstart

      1、创建maven project[Packaging:jar]

        

        

      2、导入依赖

     1 <!-- CXF的rs开发 -->
     2 <dependency>
     3     <groupId>org.apache.cxf</groupId>
     4     <artifactId>cxf-rt-frontend-jaxrs</artifactId>
     5     <version>3.0.1</version>
     6 </dependency>
     7 <!-- 内置jetty的web服务器 -->
     8 <dependency>
     9     <groupId>org.apache.cxf</groupId>
    10     <artifactId>cxf-rt-transports-http-jetty</artifactId>
    11     <version>3.0.1</version>
    12 </dependency>
    13 <!-- 日志 -->
    14 <dependency>
    15     <groupId>org.slf4j</groupId>
    16     <artifactId>slf4j-log4j12</artifactId>
    17     <version>1.7.12</version>
    18 </dependency>

      3、搭建服务端

        3.1、导入实体bean

          

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

        3.2、构建服务bean

          3.2.1、IUserService.java     

     1 package org.cxf_rs.service;
     2 
     3 import java.util.List;
     4 import org.cxf_rs.domain.User;
     5 
     6 public interface IUserService {
     7     //
     8     public void saveUser(User user);
     9     //
    10     public void deleteUser(Integer id);
    11     //
    12     public void updateUser(User user);
    13     //查-查询所有
    14     public List<User> findAllUsers();
    15     //查-根据id查询
    16     public User finUserById(Integer id);
    17 }

          3.2.2、UserServiceImpl.java

     1 package org.cxf_rs.service;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 import org.cxf_rs.domain.Car;
     7 import org.cxf_rs.domain.User;
     8 
     9 
    10 public class UserServiceImpl implements IUserService {
    11     //
    12     public void saveUser(User user) {
    13         System.out.println("save user:" + user);
    14     }
    15     //
    16     public void deleteUser(Integer id) {
    17         System.out.println("delete user id :" + id);
    18     }
    19     //
    20     public void updateUser(User user) {
    21         System.out.println("update user:" + user);
    22     }
    23     //查-查询所有
    24     public List<User> findAllUsers() {
    25         List<User> users = new ArrayList<User>();
    26         User user1 = new User();
    27         user1.setId(1);
    28         user1.setUsername("小明");
    29         user1.setCity("北京");
    30         
    31         List<Car> carList1 = new ArrayList<Car>();
    32         Car car1 = new Car();
    33         car1.setId(101);
    34         car1.setCarName("保时捷");
    35         car1.setPrice(1000000d);
    36         carList1.add(car1);
    37         Car car2 = new Car();
    38         car2.setId(102);
    39         car2.setCarName("宝马");
    40         car2.setPrice(400000d);
    41         carList1.add(car2);
    42         user1.setCars(carList1);
    43         
    44         users.add(user1);
    45         
    46         User user2 = new User();
    47         user2.setId(2);
    48         user2.setUsername("小丽");
    49         user2.setCity("上海");
    50         users.add(user2);
    51         
    52         return users;
    53     }
    54     //查-根据id查询
    55     public User finUserById(Integer id) {
    56         if (id == 1) {
    57             User user1 = new User();
    58             user1.setId(1);
    59             user1.setUsername("小明");
    60             user1.setCity("北京");
    61             return user1;
    62         }
    63         return null;
    64     }
    65 }

        3.3、添加注解

          3.3.1、domain[@XmlRootElement注解]

            

            

          未加的话报如下错误:

            

          3.3.2、service

            ①常用注解

      

            ②IUserService.java带注解 

     1 package org.cxf_rs.service;
     2 
     3 import java.util.List;
     4 
     5 import javax.ws.rs.Consumes;
     6 import javax.ws.rs.DELETE;
     7 import javax.ws.rs.GET;
     8 import javax.ws.rs.POST;
     9 import javax.ws.rs.PUT;
    10 import javax.ws.rs.Path;
    11 import javax.ws.rs.PathParam;
    12 import javax.ws.rs.Produces;
    13 
    14 import org.cxf_rs.domain.User;
    15 
    16 
    17 @Path("/userService")
    18 @Produces("*/*")
    19 public interface IUserService {
    20     //
    21     @POST
    22     @Path("/user")
    23     @Consumes({ "application/xml", "application/json" })
    24     public void saveUser(User user);
    25     //
    26     @DELETE
    27     @Path("/user/{id}")
    28     @Consumes("application/xml")
    29     public void deleteUser(@PathParam("id") Integer id);
    30     //
    31     @PUT
    32     @Path("/user")
    33     @Consumes({ "application/xml", "application/json" })
    34     public void updateUser(User user);
    35     //查-查询所有
    36     @GET
    37     @Path("/user")
    38     @Produces({ "application/xml", "application/json" })
    39     public List<User> findAllUsers();
    40     //查-根据id查询
    41     @GET
    42     @Path("/user/{id}")
    43     @Consumes("application/xml")
    44     @Produces({ "application/xml", "application/json" })
    45     public User finUserById(@PathParam("id") Integer id);
    46 }

      4、发布服务

     1 package org.cxf_rs.server;
     2 
     3 import org.apache.cxf.interceptor.LoggingInInterceptor;
     4 import org.apache.cxf.interceptor.LoggingOutInterceptor;
     5 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
     6 import org.cxf_rs.domain.Car;
     7 import org.cxf_rs.domain.User;
     8 import org.cxf_rs.service.IUserService;
     9 import org.cxf_rs.service.UserServiceImpl;
    10 
    11 
    12 public class JAX_RS_Server {
    13     public static void main(String[] args) {
    14         // 创建业务接口实现类对象
    15         IUserService userService = new UserServiceImpl();
    16         // 服务器FactoryBean创建服务
    17         JAXRSServerFactoryBean restServer = new JAXRSServerFactoryBean();
    18         restServer.setResourceClasses(User.class, Car.class);
    19         restServer.setServiceBean(userService);
    20         restServer.setAddress("http://localhost:9999/");
    21         // 打印日志
    22         restServer.getInInterceptors().add(new LoggingInInterceptor());
    23         restServer.getOutInterceptors().add(new LoggingOutInterceptor());
    24         // 发布服务
    25         restServer.create();
    26         System.out.println("服务器启动成功!");
    27     }
    28 }

      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、导入依赖

    1 <!-- 导入CXF-Client依赖 -->
    2 <dependency>
    3     <groupId>org.apache.cxf</groupId>
    4     <artifactId>cxf-rt-rs-client</artifactId>
    5     <version>3.0.1</version>
    6 </dependency>

          5.2.2、目录结构

            

          5.2.3、JAX_RS_Client.java

            ① 测试新增   

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

            

            ②测试删除  

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

          

            ③测试修改   

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

          

            ④测试查询所有

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

          

            ⑤测试根据id查询

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

          

          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转换器的依赖

     1 <!-- CXF的json转换器,拓展json -->
     2 <dependency>
     3     <groupId>org.apache.cxf</groupId>
     4     <artifactId>cxf-rt-rs-extension-providers</artifactId>
     5     <version>3.0.1</version>
     6 </dependency>
     7 <!-- 转换json的工具包,被cxf-rt-rs-extension-providers包依赖 -->
     8 <dependency>
     9     <groupId>org.codehaus.jettison</groupId>
    10     <artifactId>jettison</artifactId>
    11     <version>1.3.7</version>
    12 </dependency>
  • 相关阅读:
    vue2.0 之 douban (二)创建自定义组件tabbar
    vue2.0 之 douban (一)框架搭建 及 整体布局
    react-navigation
    react-native modal
    javascript-使用el表达式获取后台传递的数据
    java Map
    java List集合
    javascript 自定义Map
    javascript Array(数组)
    ZOJ 3868 GCD Expectation (容斥+莫比乌斯反演)
  • 原文地址:https://www.cnblogs.com/EzraOholiabXue/p/8066157.html
Copyright © 2011-2022 走看看