Spring Boot 內建 resteasy篇 — jax-rs初步介紹和spring boot內建
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用 |
規範實作
下文将以resteasy為例
包引入
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>${resteasy.version}</version>
</dependency>
resteasy使用
ServletContainerInitializer
接口來初始化項目,如果要開啟啟動掃描,掃描providers和resources。還需要引入另外一個包。
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-servlet-initializer</artifactId>
<version>${resteasy.version}</version>
</dependency>
跟spring內建,還需要spring的包
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-spring</artifactId>
<version>${resteasy.version}</version>
</dependency>
還有一些解析json之類的包
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson2-provider</artifactId>
<version>${resteasy.version}</version>
</dependency>
resteasy根據servlet容器的不同,還有些不同,這裡講的是spring boot繼承,不過多贅述,詳細見這裡 , 盡管引了這些包,項目也沒有和spring boot內建起來,因為項目不能autoconfigure,還有servlet也沒有配置的地方。
這裡我提供一個思路,實作 BeanFactoryPostProcessor接口 ,在postProcessBeanFactory 去建立servlet
Spring Boot內建
另外我提供一種比較簡單的方法,直接使用開源內建,這裡使用的是paypal開源的一個內建方案。
- 引入包
<dependency> <groupId>com.paypal.springboot</groupId> <artifactId>resteasy-spring-boot-starter</artifactId> <version>2.3.0-RELEASE</version> </dependency> <!--PS,上面的那一堆包不用引了,這個就幫我們引入了-->
- 引入spring boot的一堆包
用法
-
指定servletMapping路徑
寫一個類繼承Application,然後交給spring管理
@Component @ApplicationPath("/v1/") public class ApplicationPathImpl extends Application { }
- 編寫restful接口啦
@Component @Path("province/") public class ExternalFacadeImpl implements ExternalFacade { /** * http://localhost:8080/v1/province/city/1 * @param id * @return */ @Path("city/{id}") @GET @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) @Override public Result<Boolean> getCity(@PathParam("id") Long id) { return new Result<>(); } }
下一篇将介紹常用注解作用