基本介绍
Jersey是JAX-RS的参考实现,它包含三个主要部分。
核心服务器:通过JSR 311中标准化的注释和API标准化,可以直观方式开发Restful Web服务。
核心客户端:Jersey客户端API帮助你与REST服务通信。
继承:Jersey提供集成Spring、Guice、Apache Abdera的库。
前言
本文将学习如何使用Spring Boot和Jersey框架,去配置和创建JAX-RS 2.0 REST API接口;
这个示例应用使用的是Jersey的Servlet容器去部署REST API接口;
工程目录
利用Spring Initializr工具创建Spring Boot应用Demo
1.访问Spring Initializr网站,添加Jersey (JAX-RS)依赖,点击生成代码;
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;@Componentpublic 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;@SpringBootApplicationpublic class JerseydemoApplication extends SpringBootServletInitializer{public static void main(String[] args){new JerseydemoApplication().configure(new SpringApplicationBuilder(JerseydemoApplication.class)).run(args);}}
演示
启动Spring Boot应用,访问user 资源
访问/users/1资源

