ページの先頭行へ戻る
Interstage Application Server Java EE運用ガイド(Java EE 6編)
Interstage

4.1.7 JAX-RSアプリケーションの作成方法

JAX-RS仕様に従った代表的なアプリケーション作成方法について説明します。詳細については、JAX-RS仕様およびJava EE仕様を参照してください。

JAX-RSアプリケーションの作成時には、以下のクラスをコーディングします。

Applicationサブクラスの作成

Applicationサブクラスはjavax.ws.rs.core.Applicationクラスを継承したクラスで、一つのJAX-RSアプリケーションを表現します。配備するモジュールにApplicationサブクラスが存在する場合、モジュール内のリソースクラスが検索され、Webリソースとして公開されます。

Applicationサブクラスは以下のように作成します。

Applicationサブクラスの作成例

@ApplicationPath("samples")
public class JAXRSSampleApplication extends Application{
}

上記の例では、JAXRSSampleApplicationクラスはApplicationクラスのメソッドをオーバーライドしていないため、warファイルに含まれるすべてのリソースがこのJAX-RSアプリケーションのリソースとして公開されます。また、Webアプリケーションのコンテキストルート/samples配下のパスへのHTTPリクエストが、公開するリソースクラスに振り分けられます。

リソースクラスの作成

リソースクラスはWebリソースを表現したJavaクラスです。以下のようにして作成します。

リソースクラスの作成例

@Path("/resource")
public class SampleResource{
    @GET
    @Produces("text/html")
    public String getResource(){
        return "<html><body><p>Hello JAXRS</p></body></html>";
    }
}

リクエストURLの一部をパラメーターとして扱う場合のリソースクラスの作成例

@Path("/colors")
public class ColorResource {
    @GET
    @Path("{colorName}")
    @Produces("text/html")
    public String getColorInfo(@PathParam("colorName") String name) {
        return "<html><body><p>Color name: " + name + "</p></body></html>";
    }
}

アクセスURLについて

JAX-RSのリソースのアクセスURLは以下のように決まります。パスの区切り文字"/"は、必要に応じて追加、削除されます。

http://ホスト:ポート/コンテキストルート/Applicationサブクラスの@ApplicationPath値/リソースクラスの@Path値(/リソースメソッドの@Path値)

上記の例でApplicationサブクラスとしてJAXRSSampleApplicationクラスを用いた場合、以下のURL にHTTP GETメソッドでリクエストを送信することで、SampleResourceクラスのgetResource()メソッドが呼び出されます。

http://ホスト:ポート/コンテキストルート/samples/resource

また、以下のURL にHTTP GETメソッドでリクエストを送信することで、ColorResourceクラスのgetColorInfo()メソッドが呼び出されます。

http://ホスト:ポート/コンテキストルート/samples/colors/<"/"を含まない任意の文字列>

注意

  • 上記の例では説明のため簡略化していますが、実業務においてはクロスサイトスクリプティング対策、文字エンコーディング等の考慮を行う必要があります。

  • 同様に、アプリケーション内のリソースへの意図しないURLパターンやHTTPメソッドによるアクセスを許可しないよう、Web application deployment descriptor(web.xml)に適切なセキュリティ設定を行うなどの考慮も行なってください。

  • デフォルトでは、リソースクラスのインスタンスはリクエスト毎に生成されます。単一のインスタンスですべてのリクエストを処理したい場合は、ApplicationサブクラスでgetSingletons()メソッドを実装し、当該のインスタンスを格納したSetオブジェクトを返却するようにしてください。

  • @Consumes や@Producesの値として使用可能なMIME型についてはJAX-RSアプリケーションで利用できる標準のデータ型を参照してください。

  • JAX-RSアプリケーションにはwarファイル内にApplicationサブクラスが存在するか、deployment descriptorにJAX-RSアプリケーションの定義が存在している必要があります。これらが存在しない場合はモジュール内のリソースクラスは無視され、公開されません。deployment descriptorによるJAX-RSアプリケーションの定義方法はJAX-RS仕様を参照してください。

  • Applicationサブクラスを含むモジュールを配備した場合、asadmin list-sub-componentsコマンドを実行するとApplicationサブクラスのクラス名がコンポーネントとして表示されます。コンポーネントの型は<JSP>と表示されます。

JAX-RSアプリケーションで利用できる標準のデータ型

本製品では、JAX-RS仕様で標準サポートされている以下のJavaクラスとMIMEメディアタイプ(MIME型)の組み合わせが標準で利用できます。

Javaクラス

MIME型

byte[]

*/*

java.lang.String

*/*

java.io.InputStream

*/*

java.io.Reader

*/*

java.io.File

*/*

javax.activation.DataSource

*/*

javax.xml.transform.Source

text/xml,application/xml,application/*+xml

java.xml.bind.JAXBElement

@XmlRootElementを宣言したクラス

text/xml,application/xml,application/*+xml

javax.ws.rs.core.MultivaluedMap<String,String>

application/x-www-form-urlencoded

javax.ws.rs.core.StreamingOutput

*/*

*は任意のMIMEタイプ/サブタイプを表します。

上記以外の組み合わせを利用する場合は、javax.ws.rs.ext.Interface.MessageBodyReaderインターフェースやjavax.ws.rs.ext.Interface.MessageBodyWriterインターフェースを実装したJAX-RSエンティティプロバイダーを作成し、アプリケーションに含めてください。JAX-RSエンティティプロバイダーの詳細については、JAX-RS仕様を参照してください。

注意

  • javax.ws.rs.core.StreamingOutputクラスはレスポンス返却時のみ利用できます。

  • javax.xml.transform.Sourceクラスはレスポンス返却時のみ利用できます。リクエスト受信時に利用する場合は、Sourceクラスの代わりに以下のいずれかのクラスをリソースメソッドの引数に指定してください。

    • javax.xml.transform.stream.StreamSource

    • javax.xml.transform.sax.SAXSource

    • javax.xml.transform.dom.DOMSource

  • javax.xml.bind.JAXBElementクラスはJAXBElement<BeanClass>のように、型パラメーターを指定して利用する必要があります。

  • @XmlRootElementを宣言したクラスは、JAXBによって適切に変換可能なクラスである必要があります。

  • @Consumesや@Producesアノテーションを省略した場合は、"*/*"を指定した場合と同等の扱いとなります。

  • @Consumesに"*/*"が指定された場合、レスポンスメッセージに設定されるContent-Typeヘッダーの値はリクエストメッセージのAcceptヘッダーやメソッドの返り値のオブジェクト型などから決定されます。詳細はJAX-RS仕様を参照してください。

  • リクエスト受信時にjava.io.Fileクラスを使用する場合は、システムプロパティjava.io.tmpdirにセットされたディレクトリに次の命名規則でファイルが作成され、作成されたファイルを参照するオブジェクトがアプリケーションに渡されます。

    • rep*****tmp

      *****の部分は任意の数字です。

    ファイルの作成場所には、呼量とファイルサイズに応じて十分なディスク容量を確保してください。また、アプリケーションでの利用終了後はdeleteメソッドを呼び出すなどしてファイルを削除してください。

    JAX-RSランタイムがFileオブジェクトを生成してからアプリケーションがファイルを削除するまでの間に、予期しない例外が発生したりJavaプロセスが異常終了した場合、ファイルは削除されずに残ることがあります。その場合は、上記ファイルがどのプロセスからも使用されていないことを確認後、手動で削除してください。

    java.io.tmpdirをデフォルトの値から変更してサーバーインスタンスを運用する場合は、プロセスの実行ユーザに書き込み権限があることを確認してください。

その他の注意事項

クライアントから大きなサイズのデータを受信して処理を行う場合、データ型やヒープのサイズによっては処理中にメモリ不足になる可能性があります。必要に応じてServletFilterなどを実装し、JAX-RSアプリケーションのサーブレットが受信する入力ストリームのサイズを制限するなどの対策を講じてください。