Web Service系列(六)CXF 使用 Jax-RS规范

CXF 使用 Jax-rs规范

JAX-RS 发布服务就是使用RESTFUL风格。

服务端

添加依赖

  1. 添加jaxrs的支持包
  2. 可以使用内置服务器
  3. 添加基于restful风格的webService传递json格式相关的 支持包
  4. 注意编译环境是1.5以上
 <dependencies>
  <!-- jaxrs 的支持包 -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxrs</artifactId>
        <version>3.0.1</version>
    </dependency>

    <!-- 内置jetty服务器 比tomcat更轻量 没有tomcat适用于企业那么多高特性 -->
    <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>

    <!-- 基于restful风格的webService,客户端与服务端之间可以传递json,这就是json相关的支持包 -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-extension-providers</artifactId>
        <version>3.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jettison</groupId>
        <artifactId>jettison</artifactId>
        <version>1.3.7</version>
    </dependency>
 </dependencies>

   <build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                    <showWarnings>true</showWarnings>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
  </build>

编写实体类 , 服务接口和实现

实体类
  • 添加注解 @XmlRootElement 指定根元素
    • 作用:客户端与服务端传递对象数据时候,
      序列化为xml或json的根元素的名称
@XmlRootElement(name = "User")
public class User {
    private Integer id;
    private String username;
    private String city;
    ......
}
@XmlRootElement(name = "Car")
public class Car {
    private Integer id;
    private String carName;
    private Double price;
    ......
}
服务接口和实现

要点

  1. @Path(“/userService”) 注解

    • 路径;访问当前服务接口时候的路径、接口方法的路径。
  2. @POST : insert操作

  3. @PUT : update操作
  4. @GET : select 查询操作
  5. @DELETE : delete删除操作

  6. @Consumes : 服务端支持的请求的数据格式(xml、json)

  7. @Produces : 服务端支持的响应的数据格式
@Path("/userService")
@Produces("*/*")
public interface IUserService {

    @POST
    @Path("/user")
    @Consumes({ "application/xml", "application/json" })
    public void saveUser(User user);

    @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();

    @GET
    @Path("/user/{id}")
    @Consumes("application/xml")
    @Produces({ "application/xml", "application/json" })
    public User finUserById(@PathParam("id") Integer id);

    @DELETE
    @Path("/user/{id}")
    @Consumes({"application/xml", "application/json"})
    public void deleteUser(@PathParam("id") Integer id);
}
  • 实现
public class UserServiceImpl implements IUserService {

    public void saveUser(User user) {
        System.out.println("save user:" + user);
    }

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

    public User finUserById(Integer id) {
        if (id == 1) {
            User user1 = new User();
            user1.setId(1);
            user1.setUsername("小明");
            user1.setCity("北京");
            return user1;
        }
        return null;
    }

    public void deleteUser(Integer id) {
        System.out.println("delete user id :" + id);
    }
}

发布服务

public class App {
    public static void main(String[] args) {
        //创建服务工厂
        JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();

        //设置服务地址
        factory.setAddress("http://127.0.0.1:9999/rs/");

        //实例化服务类
        factory.setServiceBean(new UserServiceImpl());

        //添加日志拦截器
        factory.getInInterceptors().add(new LoggingInInterceptor());
        factory.getOutInterceptors().add(new LoggingOutInterceptor());

        //发布服务
        factory.create();
        System.out.println("JAXRS的9999服务发布成功!!");
    }
}

客户端

  • 添加依赖
<dependencies>
  <!-- jaxrs 的支持包 -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxrs</artifactId>
        <version>3.0.1</version>
    </dependency>

    <!-- 内置jetty服务器 比tomcat更轻量 没有tomcat适用于企业那么多高特性 -->
    <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>
    <!-- 客户端调用的时候要用 (WebClient工具类) -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-client</artifactId>
        <version>3.0.1</version>
    </dependency>

    <!-- 基于restful风格的webService,客户端与服务端之间可以传递json,这就是json相关的支持包 -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-extension-providers</artifactId>
        <version>3.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jettison</groupId>
        <artifactId>jettison</artifactId>
        <version>1.3.7</version>
    </dependency>

    <!-- junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
        <scope>test</scope>
    </dependency>
 </dependencies>

   <build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                    <showWarnings>true</showWarnings>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
  </build>

实体类(不需要服务接口)

  • 添加注解 @XmlRootElement 指定根元素
    • 作用:客户端与服务端传递对象数据时候,
      序列化为xml或json的根元素的名称
@XmlRootElement(name = "User")
public class User {
    private Integer id;
    private String username;
    private String city;
    ......
}
@XmlRootElement(name = "Car")
public class Car {
    private Integer id;
    private String carName;
    private Double price;
    ......
}

远程调用服务

基于RestFul风格的web service的开发的客户端调用,直接通过一个类完成 WebClient

POST请求方式

POST执行的是insert操作

@Test
public void save(){
    //默认是xml数据传递方式  POST是增 insert操作
//      WebClient.create("http://127.0.0.1:9999/rs/userService/user")
//          .post(new User(100,"Hello","GZ"));

    //使用json格式
    WebClient.create("http://127.0.0.1:9999/rs/userService/user")
        .type(MediaType.APPLICATION_JSON)
        .post(new User(100,"Hello","GZ"));
}

image

是通过type(MediaType.APPLICATION_JSON)来指定请求的数据类型

image


PUT请求方式

PUT是执行update操作

@Test
public void update(){
    //PUT 是 update操作
//  WebClient.create("http://127.0.0.1:9999/rs/userService/user")
//      .put(new User(100,"Hello","GZ"));

    //使用json格式
    WebClient.create("http://127.0.0.1:9999/rs/userService/user")
        .type(MediaType.APPLICATION_JSON)
        .put(new User(100,"Hello","GZ"));

}

image


GET请求方式

GET 执行的是查询操作

  • 需要在url上指定id 服务接口会自动获取然后映射到方法参数上
    • 可看最下面的服务接口的方法的注解

也就是如果方法需要的参数可以写在url上在映射到方法参数上

查询单个 findOne
@Test
public void findOne(){
    //GET 是查询操作 查询单个需要在url上指定id 服务接口会自动获取然后映射到方法参数上
//      User user = WebClient.create("http://127.0.0.1:9999/rs/userService/user/1")
//          .get(User.class);

    //使用json格式
    User user = WebClient.create("http://127.0.0.1:9999/rs/userService/user/1")
            //这是设置请求的数据类型
//              .type(MediaType.APPLICATION_JSON)
            //设置响应的数据类型
            .accept(MediaType.APPLICATION_JSON)
            .get(User.class);

    System.out.println(user);
}

image

通过accept(MediaType.APPLICATION_JSON)设置响应的数据类型

image

查询多个 findAll
@Test
public void findAll(){
    //GET 是查询操作 获取多个使用getCollection
    Collection<? extends User> collection = WebClient.create("http://127.0.0.1:9999/rs/userService/user")
//          .accept(MediaType.APPLICATION_JSON)
        .getCollection(User.class);

    System.out.println(collection);
}

image


DELETE请求方式

DELETE 执行的是 delete操作

  • 需要在url上指定id 服务接口会自动获取然后映射到方法参数上
    • 可看最下面的服务接口的方法的注解
@Test
public void delete(){
    //DELETE 是delete操作 需要在url上指定id 服务接口会自动获取然后映射到方法参数上
    WebClient.create("http://127.0.0.1:9999/rs/userService/user/1")
        .delete();

}

服务的接口

@Path("/userService")
@Produces("*/*")
public interface IUserService {

    @POST
    @Path("/user")
    @Consumes({ "application/xml", "application/json" })
    public void saveUser(User user);

    @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();

    @GET
    @Path("/user/{id}")
    @Consumes("application/xml")
    @Produces({ "application/xml", "application/json" })
    public User finUserById(@PathParam("id") Integer id);

    @DELETE
    @Path("/user/{id}")
    @Consumes({"application/xml", "application/json"})
    public void deleteUser(@PathParam("id") Integer id);
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值