天天看點

Spring Boot 內建 resteasy篇 — jax-rs初步介紹和spring boot內建

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<>();
      }
    }
               
下一篇将介紹常用注解作用

繼續閱讀