JAX-RS應用程序發佈方式

JAX-RS應用程序由一個或多個資源(Resource)和零個或多個提供程序(Provider)組成。 組成JAX-RS應用程序的資源和提供程序是經過應用程序提供的Application子類進行配置的。 一個JAX-RS的實現能夠提供替代的機制來定位資源類和提供者(例如運行時類掃描),可是使用Application是惟一可移植的配置方式。java

根據應用程序是在Java SE環境中運行仍是在容器中運行,應用程序以不一樣的方式發佈。這裏討論將JAX-RS打包成Java Web的形式進行部署。建議實現支持Servlet3框架可插入性機制,以實現容器之間的可移植性,並利用容器提供的類掃描功能。web

JAX-RS應用程序做爲Web應用程序打包在.war文件中。 應用程序類打包在WEB-INF/classs或WEB-INF/lib中,而所需的庫打包在WEB-INF/lib中。 有關Web應用程序打包的完整詳細信息,請參見Servlet規範。服務器

1,使用Servlet的可插拔機制

使用可插拔機制時,必須知足如下條件app

1.1 若是不存在Application的子類

若是不存在Application子類,則須要JAX-RS實現來動態添加servlet並將其名稱設置爲
javax.ws.rs.core.Application,並自動發現必須與應用程序打包在一塊兒的全部根資源類和提供程序。 框架

另外,應用程序必須與web.xml打包在一塊兒,該web.xml爲添加的servlet指定servlet映射。 這樣的web.xml文件的示例:ide

<?xml version="1.0" encoding="UTF-8"?>
<web-app
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">
    <servlet>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
    </servlet>
    <servlet-mapping>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <url-pattern>/myresources/*</url-pattern>
    </servlet-mapping>
</web-app>

1.2 若是存在Application的子類

  • 若是已經有一個處理該應用程序的servlet。 即一個具備參數名爲javax.ws.rs.Application值爲Application子類徹底限定名的Servlet,那麼JAX-RS實現不須要任何其餘配置步驟。url

  • 若是沒有servlet處理此應用程序,則須要JAX-RS實現來動態添加其徹底限定名稱必須是Application子類名稱的servlet。若是Application子類使用@ApplicationPath註釋,則要求實現使用此註釋的值附加「 / *」來定義所添加服務器的映射。 不然,必須將應用程序與指定servlet映射的web.xml打包在一塊兒。 例如,若是org.example.MyApplication是應用程序的名稱子類,示例web.xml將是:
    <web-app version="3.0"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <servlet>
        <servlet-name>org.example.MyApplication</servlet-name>
    </servlet>
    <servlet-mapping>
        <servlet-name>org.example.MyApplication</servlet-name>
        <url-pattern>/myresources/*</url-pattern>
    </servlet-mapping>
    </web-app>

當歸檔中存在Application子類時,若是Application.getClasses和Application.getSingletons方法都返回一個空集合,那麼全部被打包在web應用程序中的根資源類(root resource)和提供程序(provider)必須被JAX-RS的實現經過如上所述描述掃描war文件來自動發現它們。若是getClasses或getSingletons中的任何一個返回非空集合,則僅返回的那些類或單例必須包含在已發佈的JAX-RS應用程序中。code

下表總結了Servlet 3框架可插拔性機制:xml

條件(Condition) 活動(Action) Servlet名稱(Servlet Name) web.xml
沒有Application子類 須要添加Servlet javax.ws.rs.core.Application 須要配置servlet的mapping
Application的子類被存在的Servlet處理 (已經定義) 不須要
Application的子類未被存在的Servlet處理 須要添加Servlet Application的子類 若是子類沒有添加@ApplicationPath註解則須要配置servlet的mapping

若是未使用Servlet 3框架的可插入性機制(例如在Servlet 3.0以前的容器中),則web.xml描述符的servlet-class或filter-class元素應分別命名爲JAX-RS實現提供的servlet或filter類。應使用參數名稱爲javax.ws.rs.Application的init-param標識Application子類。資源

請注意,上述Servlet 3框架可插入性機制基於Servlet,而不是過濾器。 傾向於使用JAX-RS實現提供的過濾器類的應用程序必須使用Servlet 3.0以前的配置機制。

相關文章
相關標籤/搜索