zoukankan      html  css  js  c++  java
  • Spring Boot Jersey使用示例

    前言

    本文将学习如何使用Spring Boot和Jersey框架,去配置和创建JAX-RS 2.0 REST API接口;
    这个示例应用使用的是Jersey的Servlet容器去部署REST API接口;

    工程目录

    本文例子中的工程代码结果如下:
    file

    利用Spring Initializr工具创建Spring Boot应用Demo

    1.访问Spring Initializr网站,添加Jersey (JAX-RS)依赖,点击生成代码;
    file
    2.下载代码到本地,解压,导入代码到IDE中
    3.检查下pom.xml代码里是否包含了spring-boot-starter-jersey依赖;

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jersey</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    

    创建JAX-RS REST资源

    现在,我们就可以开始创建JAX-RS REST资源了,创建完成后,可以进行测试;
    先创建一个UserResource类,代码如下:
    UserResource.java

    package com.howtodoinjava.jerseydemo;
     
    import java.net.URI;
    import java.net.URISyntaxException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Map;
     
    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 javax.ws.rs.core.Response;
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlRootElement;
     
    @XmlAccessorType(XmlAccessType.NONE)
    @XmlRootElement(name = "users")
    @Path("/users")
    public class UserResource
    {
        private static Map<Integer, User> DB = new HashMap<>();
         
        @GET
        @Produces("application/json")
        public Users getAllUsers() {
            Users users = new Users();
            users.setUsers(new ArrayList<>(DB.values()));
            return users;
        }
         
        @POST
        @Consumes("application/json")
        public Response createUser(User user) throws URISyntaxException
        {
            if(user.getFirstName() == null || user.getLastName() == null) {
                return Response.status(400).entity("Please provide all mandatory inputs").build();
            }
            user.setId(DB.values().size()+1);
            user.setUri("/user-management/"+user.getId());
            DB.put(user.getId(), user);
            return Response.status(201).contentLocation(new URI(user.getUri())).build();
        }
     
        @GET
        @Path("/{id}")
        @Produces("application/json")
        public Response getUserById(@PathParam("id") int id) throws URISyntaxException
        {
            User user = DB.get(id);
            if(user == null) {
                return Response.status(404).build();
            }
            return Response
                    .status(200)
                    .entity(user)
                    .contentLocation(new URI("/user-management/"+id)).build();
        }
     
        @PUT
        @Path("/{id}")
        @Consumes("application/json")
        @Produces("application/json")
        public Response updateUser(@PathParam("id") int id, User user) throws URISyntaxException
        {
            User temp = DB.get(id);
            if(user == null) {
                return Response.status(404).build();
            }
            temp.setFirstName(user.getFirstName());
            temp.setLastName(user.getLastName());
            DB.put(temp.getId(), temp);
            return Response.status(200).entity(temp).build();
        }
     
        @DELETE
        @Path("/{id}")
        public Response deleteUser(@PathParam("id") int id) throws URISyntaxException {
            User user = DB.get(id);
            if(user != null) {
                DB.remove(user.getId());
                return Response.status(200).build();
            }
            return Response.status(404).build();
        }
         
        static
        {
            User user1 = new User();
            user1.setId(1);
            user1.setFirstName("John");
            user1.setLastName("Wick");
            user1.setUri("/user-management/1");
     
            User user2 = new User();
            user2.setId(2);
            user2.setFirstName("Harry");
            user2.setLastName("Potter");
            user2.setUri("/user-management/2");
             
            DB.put(user1.getId(), user1);
            DB.put(user2.getId(), user2);
        }
    }
    

    Users.java

    package com.howtodoinjava.jerseydemo;
      
    import java.util.ArrayList;
     
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
      
    @XmlAccessorType(XmlAccessType.NONE)
    @XmlRootElement(name = "users")
    public class Users {
      
        @XmlElement(name="user")
        private ArrayList<User> users;
      
        public ArrayList<User> getUsers() {
            return users;
        }
      
        public void setUsers(ArrayList<User> users) {
            this.users = users;
        }
    }
    

    User.java

    package com.howtodoinjava.jerseydemo;
      
    import java.io.Serializable;
      
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
      
    @XmlAccessorType(XmlAccessType.NONE)
    @XmlRootElement(name = "user")
    public class User implements Serializable {
      
        private static final long serialVersionUID = 1L;
      
        @XmlAttribute(name = "id")
        private int id;
      
        @XmlAttribute(name="uri")
        private String uri;
      
        @XmlElement(name = "firstName")
        private String firstName;
      
        @XmlElement(name = "lastName")
        private String lastName;
      
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getFirstName() {
            return firstName;
        }
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
        public String getLastName() {
            return lastName;
        }
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
        public String getUri() {
            return uri;
        }
        public void setUri(String uri) {
            this.uri = uri;
        }
    }
    

    配置Jersey

    到目前为止,我们已经创建了一个JAX-RS资源,现在我们想通过spring boot应用去访问它,步骤如下;
    1.首先我们要注册改资源为Jersey资源,代码如下:

    package com.howtodoinjava.jerseydemo;
     
    import org.glassfish.jersey.server.ResourceConfig;
    import org.springframework.stereotype.Component;
     
    @Component
    public class JerseyConfig extends ResourceConfig
    {
        public JerseyConfig()
        {
            register(UserResource.class);
        }
    }
    

    注意需要加上 @Component注解,以便Spring Boot能够扫描到;
    2.其次JerseyConfig需要继承ResourceConfig,该类提供了很多高级功能,简化了JAX-RS组件的注册工作;
    3.最后Spring Boot Application启动类需要继承SpringBootServletInitializer

    package com.howtodoinjava.jerseydemo;
     
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.support.SpringBootServletInitializer;
     
    @SpringBootApplication
    public class JerseydemoApplication extends SpringBootServletInitializer
    {
        public static void main(String[] args)
        {
            new JerseydemoApplication().configure(new SpringApplicationBuilder(JerseydemoApplication.class)).run(args);
        }
    }
    

    演示

    启动Spring Boot应用,访问user 资源
    file
    访问/users/1资源
    file

  • 相关阅读:
    bzoj 3744: Gty的妹子序列 主席树+分块
    bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
    bzoj 3041: 水叮当的舞步 迭代加深搜索 && NOIP RP++
    约瑟夫问题例题小结
    bzoj 3594: [Scoi2014]方伯伯的玉米田 dp树状数组优化
    人生第一场CTF的解题报告(部分)
    ZOJ 3811 Untrusted Patrol【并查集】
    POJ 2112: Optimal Milking【二分,网络流】
    Codeforces Round #277 (Div. 2 Only)
    POJ 2195 Going Home【最小费用流 二分图最优匹配】
  • 原文地址:https://www.cnblogs.com/chenpi/p/9785955.html
Copyright © 2011-2022 走看看