抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

SpringBoot整合JAX-RS

JAX-RS简介

什么是JAX-RS

​ JAX-RS 是 JAVA EE6 引入的一个新技术。 JAX-RS 即 Java API for RESTful Web Services,是一个 Java 编程语言的应用程序接口,支持按照表述性状态转移 (REST)架构风格创建 Web 服务。JAX-RS 使用了 Java SE5 引入的 Java 注解来 简化 Web 服务的客户端和服务端的开发和部署。 其实就是类似于 Servlet 规范来接收用户请求的一个范。

JAX-RS 是代表restful web service的一套规范API,JAX-RS规范基于JAVA编程语言,它是用来创建Restful 风格的web services服务的。Jax-rs使用一系列注解来简化java开发。

​ JAX-RS也称jsr339 (全称java specifications requests java规范提案第339个),由jcp(java community process)组织经过投票通过。

​ 为了加深对jsr的理解,举一个简单的例子,jsr 330标准就是依赖注入的提案,已经通过。

规范说明

规范定义了一些常见的注解(见下表),用来标注一种资源文件为restfun风格的资源文件

序号 注解 描述
1 @Path 类或者方法的相对地址,标注在类或者方法上
2 @GET HTTP GET请求用,用来获取资源
3 @PUT HTTP PUT 请求,用来创建资源
4 @POST HTTP POST 请求, 用来创建或者更新资源
5 @DELETE HTTP DELETE请求, 用来删除资源
6 @HEAD HTTP HEAD请求, 用来获取一个接口是否可用的状态
7 @Produces 返回数据的格式比如APPLICATION/XML, TEXT/HTML, APPLICATION/JSON
8 @Consumes 请求数据格式 , 如json
9 @PathParam 绑定url里面的参数
10 @QueryParam 绑定url后面的参数(?后面的)
11 @MatrixParam 绑定包含多个 property (属性)=value(值) 方法参数表达式
12 @HeaderParam 给header里面传参
13 @CookieParam 给cookie里面传参
14 @FormParam 给form传参
15 @DefaultValue 给参数一个默认值
16 @Context 可以注入HttpRequest,HttpResponse用

规范实现

POM引入依赖

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jersey</artifactId>
</dependency>

配置类

创建JerseyConfig
1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
public class JerseyConfig {

@Bean
public ServletRegistrationBean jerseyServlet() {
//手动注册servlet
ServletRegistrationBean registrationBean = new ServletRegistrationBean(new ServletContainer(), "/rest/*");
registrationBean.addInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS,JerseyResourceConfig.class.getName());

return registrationBean;
}
}
创建JerseyResourceConfig
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class JerseyResourceConfig extends ResourceConfig {

public JerseyResourceConfig() {
/*
* Servlet Filter that exposes the request to the current thread, through both org.springframework.context.i18n.LocaleContextHolder and RequestContextHolder. To be registered as filter in web.xml.<br/>
Alternatively, Spring's org.springframework.web.context.request.RequestContextListener and Spring's org.springframework.web.servlet.DispatcherServlet also expose the same request context to the current thread.<br/>
This filter is mainly for use with third-party servlets, e.g. the JSF FacesServlet. Within Spring's own web support, DispatcherServlet's processing is perfectly sufficient.<br/>
*/
register(RequestContextFilter.class);

// 加载资源文件,这里直接扫描com.example.demo.controller下的所有api
packages("com.demo.controller");
//register(HelloController.class); //@wjw_note: 这种是注册单个的 JAX-RS component!
}
}

创建接口

1
2
3
4
5
6
7
8
9
10
11
12
13
@Path("/user/")
public class HelloController {
@Path("{id}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public User hello(@PathParam("id") String id) {
User user = new User();
user.setId(id);
user.setUsername("mvc JAX-RS 测试");

return user;
}
}

测试访问

启动Spring Boot程序

http://localhost:8080/rest/user/123456

返回 {"id":"123456","username":"mvc JAX-RS 测试"}

JAX-RS常用注解介绍

@GET

http请求方式里面的get请求,标记这个请求方式为get

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* http://localhost:8080/rest/province/city/1
*
* @param id
* @return
*/
@Path("city/{id}")
@GET
@Produces(MediaType.APPLICATION_JSON) //表示输出json
@Consumes(MediaType.APPLICATION_JSON) //表示输入为json
public Result<Boolean> getCity(@PathParam("id") Long id) {

return new Result<>();
}

@PUT

http请求方式里面的get请求,标记这个请求方式为put

一般用来创建一个资源

1
2
3
4
5
6
7
8
@Path("city/{id}")
@PUT
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Result<Boolean> putCity(@PathParam("id") Long id) {

return new Result<>();
}

@POST

http请求方式里面的get请求,标记这个请求方式为post

一般用来创建和更新

1
2
3
4
5
6
7
8
@Path("city/{id}")
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Result<Boolean> postCity(@PathParam("id") Long id) {

return new Result<>();
}

@DELETE

http请求方式里面的get请求,标记这个请求方式为delete

一般用来删除一个资源

1
2
3
4
5
6
7
@Path("city/{id}")
@DELETE
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Result<Boolean> deleteCity(@PathParam("id") Long id) {
return new Result<>();
}

@PathParam

一般url里面的参数用PathParam

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* http://localhost:8080/rest/province/city/1
*
* @param id
* @return
*/
@Path("city/{id}")
@GET
@Produces(MediaType.APPLICATION_JSON) //表示输出json
@Consumes(MediaType.APPLICATION_JSON) //表示输入为json
public Result<Boolean> getCity(@PathParam("id") Long id) {

return new Result<>();
}

@QueryParam

可以输出url后面的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* http://localhost:8080/rest/queryCity/1?name=wh
*
* @param id
* @param name
* @return
*/
@Path("queryCity/{id}")
@GET
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Result<Boolean> queryCity(@PathParam("id") Long id, @QueryParam("name") String name) {
System.out.println(name);
return new Result<>();
}

@HeaderParam

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* http://localhost:8080/rest/queryCity/1?name=wh
*
* @param authKey
* @param id
* @param name
* @return
*/
@Path("queryCity/{id}")
@GET
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Result<Boolean> queryHeaderCity(@HeaderParam("auth") String authKey, @PathParam("id") Long id, @QueryParam("name") String name) {
System.out.println(name);
System.out.println(authKey);
return new Result<>();
}

@CookieParam

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* http://localhost:8080/rest/queryCity/1?name=wh
* @param sessionId
* @param authKey
* @param id
* @param name
* @return
*/
@Path("queryCity/{id}")
@GET
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Result<Boolean> queryCookieCity(@CookieParam("__utma") String sessionId, @HeaderParam("auth") String authKey, @PathParam("id") Long id, @QueryParam("name") String name) {
System.out.println(name);
System.out.println(sessionId);
System.out.println(authKey);
return new Result<>();
}

注: _utma是postman里面自带的一个cookie,所以直接调用就可以拿到值,不用额外设置

@MatrixParam

matrixParam一般是用来分离参数的,一般和分号一起使用,下例中,分号后面的from被成功识别打印

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* http://localhost:8080/rest/queryCity/1;from=wh?name=sh
*
* @param from
* @param sessionId
* @param authKey
* @param id
* @param name
* @return
*/
@Path("queryCity/{id}")
@GET
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Result<Boolean> queryMatrixCity(@MatrixParam("from") String from, @CookieParam("__utma") String sessionId, @HeaderParam("auth") String authKey, @PathParam("id") Long id, @QueryParam("name") String name) {
System.out.println(id);
System.out.println(name);
System.out.println(sessionId);
System.out.println(authKey);
System.out.println(from);
return new Result<>();
}

@FormParam

postman里面改为post请求,表单中添加age参数,得到输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* http://localhost:8080/rest/city/1?name=%22%E5%B0%8F%E6%98%8E%22
*
* @param age
* @param id
* @param name
* @return
*/
@POST
@Path("city/{id}")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_JSON)
public Result<Boolean> addBook(@FormParam("age") Integer age, @PathParam("id") String id, @QueryParam("name") String name) {
System.out.println(id);
System.out.println(name);
System.out.println(age);
return new Result<>();
}

@DefaultValue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* http://localhost:8080/rest/queryCity/1?name=wh
*
* @param id
* @param name
* @return
*/
@Path("queryCity/{id}")
@GET
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Result<Boolean> queryDefaultValueCity(@PathParam("id") Long id, @DefaultValue("sh") @QueryParam("name") String name) {
System.out.println(name);
return new Result<>();
}

@Context

The @Context 注解允许你注入下面这些类

  • javax.ws.rs.core.HttpHeaders

  • javax.ws.rs.core.UriInfo

  • javax.ws.rs.core.Request

  • javax.servlet.http.HttpServletRequest

  • javax.servlet.http.HttpServletResponse

  • javax.servlet.ServletConfig

  • javax.servlet.ServletContext

  • javax.ws.rs.core.SecurityContext

在filter中使用较多

@Encoded and encoding

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* http://localhost:8080/rest/en_city/小明
*
* @param name
* @return
*/
@Path(value = "en_city/{name}")
@GET
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Result<Boolean> getCity(@PathParam("name") @Encoded String name) {
System.out.println(name);
return new Result<>();
}

评论