web-dev-qa-db-ja.com

JAX-RSアプリケーションをデプロイする方法は?

JAX-RS 1.1仕様には、6ページに記載されています。

Applicationサブクラスが存在しない場合、追加されるサーブレットの名前を指定する必要があります。

javax.ws.rs.core.Application

追加されたサーブレットとは何ですか?それは任意のサーブレットでしょうか?

Applicationサブクラスが存在し、次の名前のサーブレット初期化パラメーターを持つサーブレットが既に定義されている場合:

javax.ws.rs.Application

ここでも、「サーブレット」とは何ですか?

既存のサーブレットによって処理されていないApplicationサブクラスが存在する場合、ContainerInitializerによって追加されたサーブレットには、Applicationサブクラスの完全修飾名を使用して名前を付ける必要があります。

「ContainerInitializerによって追加されたサーブレット」とは、サーブレットが自動的に追加されることを意味しますか?構成はどのように見えますか?

現時点では、Applicationクラスもweb.xmlも使用しておらず、動作します(GlassFish 3.1で)。この展開メカニズムでは、クラスパス全体をスキャンする必要がありますか?

サーブレットコンテナにデプロイする方法

Webには、混乱するほど多くの構成オプションがあります。これを参照してください web.xmlのコンテキストパラメーターの例 (私には機能しません!)。 JAX-RSアプリケーションをデプロイする好ましい方法は何ですか?

32
deamon

Java EE 6コンテナー(より具体的にはサーブレット3.0実装)にデプロイするためのオプションがいくつかあります。

最も簡単なのは:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://Java.Sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/j2ee http://Java.Sun.com/xml/ns/j2ee/web-app_3_0.xsd" version="3.0">
    <servlet>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>

その後、Webアプリケーションで見つかったすべての@Pathおよび@Providerクラスは、"/rest/*"のサーブレットURLパターンを持つ「デフォルト」のJAX-RSアプリケーションで使用可能になります。

javax.ws.rs.core.Applicationを拡張する1つ以上のクラスがある場合、次のように指定できます。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://Java.Sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/j2ee http://Java.Sun.com/xml/ns/j2ee/web-app_3_0.xsd" version="3.0">
    <servlet>
        <servlet-name>com.example.jaxrs.MyApplication</servlet-name>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>com.example.jaxrs.MyApplication</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>

URLで特定の@Path/@Providerクラスのセットのみを返したい場合は、上記を実行できます(上記の異なるURLパターンを持つ2つ目のMyApplication2を作成できます)。

web.xml全体を完全にスキップして、URLパターンとして機能する@ApplicationPathを使用してMyApplicationクラスに注釈を付けることもできます。いずれにせよ、おそらくウェブアプリケーションに関する他の情報を追加する必要があるため、web.xmlを保持することをお勧めします。

servlet-classがどこから来ているのか疑問に思っている場合は、環境によって自動的に追加されます。サーブレット3.0 ServletContextを見ると、アイデアを得ることができます。

62
Bryant Luk

WAS 8.5では、web.xmlを変更して以下を追加します。

<servlet>
    <servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.tada.rest.RestApplication</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
</servlet>
<servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

私のRestApplicationは次のようになります:

import Java.util.HashSet;
import Java.util.Set;

import javax.ws.rs.core.Application;

public class RestApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> sets = new HashSet<Class<?>>();
        sets.add(RestService.class);
        return sets;
    }
}

私のRestServiceは次のようになります

@Path("/tada")
public class RestService {
    @GET
    public String getSomething() {
        return "tada";
    }
}

そして、pom.xmlに依存関係を追加します。

<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.0</version>
</dependency>
1

Servlet3.0では、これに従ってください。これは私のために働く。

<servlet>
    <description>JAX-RS Tools Generated - Do not modify</description>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>your.restsrv.config.RESTConfig</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <enabled>true</enabled>
    <async-supported>false</async-supported>
</servlet>
<servlet>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
0
PrasadO