Jersey 開發RESTful(十)Jersey的配置

weixin_34391445發表於2018-01-24

【原創文章,轉載請註明原文章地址,謝謝!】

預設情況下,不管是使用Servlet容器啟動還是內建伺服器啟動,我們都是使用的Jersey的預設配置選項。本節我們簡單的介紹一下Jersey的一些自定義配置方式。

Application

在JAX-RS中,提供了一個非常重要的物件:javax.ws.rs.core.Application。該類定義了一個JAX-RS應用的基本元件和相關的資訊。一般我們可以使用Application或者通過繼承Application類來完成自己的特定的配置。
該類中就只提供了三個方法用來複寫:

  • public Set<Class<?>> getClasses():該方法需要返回一組元件的型別,返回的型別就是需要註冊的元件,可以是資源類,Providers等。
  • public Set<Object> getSingletons():該方法需要返回一組元件的例項,這些例項就是資源類,Providers等,但是要求這些資源類,Provider的例項都是完成了相關依賴的注入的,並且都是單利的(這點我們在之前已經介紹過了@Singleton)。本質來說,這個方法就是JAX-RS的各種元件的工廠方法。
  • public Map<String, Object> getProperties():該方法是自定義的針對Jersey的配置項。返回的配置項將會設定給javax.ws.rs.core.Configuration介面的實現,一個Configuration物件儲存了一個JAX-RS應用的配置狀態。

通過上面的介紹我們可以看到,如果要我們自己完全通過繼承Application類,來實現我們自己的應用配置,這個是很困難的時候。所以更多的時候,我們採用了另外的方式。

ResourceConfig

為了方便我們自定義應用,Jersey提供了org.glassfish.jersey.server.ResourceConfig類來簡化我們的操作。ResourceConfig類是Jersey自己實現了Application,並且還實現了Configuration介面。
ResourceConfig類提供了非常多的方法來註冊JAX-RS元件,比如自動的資源類掃描就是其提供的眾多功能之一。
我們想要使用ResourceConfig類來註冊我們自己的元件,只需要繼承ResourceConfig,並且在構造方法中,註冊我們自己的元件即可。

public class RestApplication extends ResourceConfig {

public RestApplication(){
    this.packages("cn.wolfcode.jersey");
    this.registerClasses(MyResourceInotherPackage.class);
    this.register(MultiPartFeature.class);
    this.register(FastjsonBodyReader.class);
    this.register(FastjsonBodyWriter.class);
    this.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE_SERVER, true);
}
}

在這個自定義類中,展示了幾點:
1,通過繼承ResourceConfig類,並且在類的構造方法中,完成了我們自己的元件註冊和配置;
2,最常用的配置方法:

  • packages:提供自動掃描元件,包括資源類,Provider,Feature;如果有多個包需要掃描,用分號隔開;
  • registerClasses:提供手動註冊元件,包括資源類,Provider,Feature等,提供可變引數同時註冊多個;
  • register:提供手動註冊元件,包括Provider和Feature;
  • property:提供手動新增配置選項的方法;

完成配置之後,我們提供在Servlet環境和內建環境下兩種配置方式:

在Servlet環境下配置

修改web.xml,去掉之前的自動包掃描配置,替換為Application的配置:

<servlet>
    <servlet-name>JerseyServletContainer</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>cn.wolfcode.jersey._02Application.RestApplication</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

新增了javax.ws.rs.Application配置,值設定為自己的ResourceConfig類即可。

內建環境下配置

public class App {

public static void main(String[] args) {
    JettyHttpContainerFactory.createServer(URI.create("http://localhost:8082/"), new RestApplication());
}
}

也非常簡單,只需要在第二個引數中,建立我們自定義的ResourceConfig類的例項即可!!

使用Filter配置Jersey

之前我們在Servlet容器中,使用的是Servlet的方式來完成Jersey前置控制器的配置,其實Jersey的ServletContainer類,既是一個Servlet,又是一個Filter,所以可能也能看到這樣的配置:

<filter>
    <filter-name>JerseyServletContainer</filter-name>
    <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>cn.wolfcode.jersey._02Application.RestApplication</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>JerseyServletContainer</filter-name>
    <url-pattern>/webapi/*</url-pattern>
</filter-mapping>

只需要把servlet配置換成filter即可!

Servlet3.0容器下的配置

在Servlet3.0之後,容器提供了更多的非XML配置的方式,允許通過程式設計的方式完成應用的配置。如果我們的應用釋出在支援Servlet3.0容器中,又有更為簡單的配置方式,下面列出最常見的Servlet3.0容器下的配置方式:

@ApplicationPath("webapi")
public class RestApplication extends ResourceConfig {

public RestApplication(){
    this.packages("cn.wolfcode.jersey");
}
}

只需要在我們的ResourceConfig繼承類上面新增@ApplicationPath註解即可。在ApplicationPath中設定的就是應用的虛擬目錄。
這裡稍微注意一點,就是如果部署在Servlet3.0容器中,pom.xml中需要新增的依賴是:

<dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.25</version>
    </dependency>

還有一個類似的依賴是jersey-container-servlet-core,這個依賴包只適合配置在Servlet2.5容器中。

小結

在本節中,主要介紹了Jersey中的自定義配置,和相關的一些基本的部署方式。為我們後面即將要講到的Provider等提供基本的操作基礎。

807144-1e32082fd0c351ac.jpeg
WechatIMG7.jpeg

相關文章