依存性の注入を使用した JAX-RS リソースの実装

Java Contexts and Dependency Injection (JCDI) は、管理 Bean における依存性の注入をサポートします。 Web アプリケーションを JCDI 対応にすることにより、 @javax.inject.Inject アノテーション付きフィールドおよびプロパティー を追加できます。アノテーション付きフィールドおよびプロパティーが有効な JCDI 管理 Bean を持つ 有効な注入ポイントである場合は、その依存性が実行時に解決されます。 依存性の注入は、コード内で、 Java タイプの新規インスタンスの作成と、 これらの Java タイプの使用とを分離します。 依存性の注入により、 コードのテストが容易になり、アプリケーションの管理も効率的になります。

このタスクについて

このタスクでは、beans.xml デプロイメント記述子を追加することにより、 JCDI を使用するようにアプリケーションを構成します。その後、実行時に解決される @javax.inject.Inject フィールドを持つ標準の Java API for RESTful Web Services (JAX-RS) リソース・タイプを作成します。

以下に、JCDI 対応の、JAX-RS を使用した簡単な Web アプリケーションを作成する方法について説明します。

手順

  1. WEB-INF ディレクトリー内の Web アプリケーション (WAR) に beans.xml デプロイメント記述子を追加します。 これは、Web アプリケーションが JCDI 対応アプリケーションであることを示します。 WEB-INF/beans.xml ファイルがあるということは、 アーカイブが JCDI 対応のアーカイブであることを示しています。このタスクでは、 デプロイメント記述子に追加情報を追加する必要はありません。以下の例は、 基本的な WEB-INF/beans.xml ファイルを示しています。
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/
    XMLSchema-instance" xsi:schemeLocation="http://java.sun.com/xml/ns/javaee http://
    java.sun.com/xml/ns/javaee/beans_1_0.xsd">
    
    <!-- This is empty on purpose. -->
    
    </beans>
  2. JAX-RS ルート・リソース・クラスを作成します。 以下の例は、簡単な JAX-RS ルート・リソース・クラスを示しています。
    package com.example.jaxrs;
    
    @javax.ws.rs.Path("exampleWithInjection")
    public class StringResource {
        public StringResource() {
            /* use a no-argument constructor */
        }
    
        @javax.ws.rs.core.Context
        private javax.ws.rs.core.HttpHeaders httpHeaders;
    
        @javax.annotation.PostConstruct
        private void myPostConstruct() {
            /* read from the httpHeaders if required */
        }
    
        @javax.ws.rs.GET
        @javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
        public String get() {
            return "Hello world!";
        }
    }

    前のコードでは、引数がないコンストラクターが使用されています。 引数がないコンストラクターは、クラスを有効な JCDI Bean にする、有効な JCDI コンストラクターです。 オブジェクトのインスタンス生成時に JAX-RS コンテキスト・オブジェクトまたはパラメーター を注入したい場合は、Bean プロパティーまたは Bean フィールドを使用できます。 オブジェクトの構成後に呼び出される @javax.annotation.PostConstruct アノテーション 付きメソッドを使用します。

  3. JCDI ライフサイクル・スコープを JAX-RS クラスに追加します。 以下の例は、@javax.enterprise.context.RequestScoped スコープ・アノテーション を付けた JAX-RS ルート・リソース・クラスを示しています。
    ベスト・プラクティス ベスト・プラクティス: @javax.enterprise.context.RequestScoped アノテーションをルート・リソース・クラスに追加して、JAX-RS ルート・リソース・クラスが要求ごとに固有のインスタンスを持つようにします。 これは、非 JCDI 対応アプリケーションではデフォルトの動作です。bprac
    package com.example.jaxrs;
    
    @javax.ws.rs.Path("exampleWithInjection")
    @javax.enterprise.context.RequestScoped
    public class StringResource {
    
        @javax.ws.rs.GET
        @javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
        public String get() {
            return "Hello world!";
        }
    }
  4. JAX-RS ルート・リソースに注入されるクラスを作成します。 以下の例は、標準の Java クラスを示しています。
    package com.example.jaxrs;
    
    public class Data {
        public String getData() {
            return "Hello world!";
        }
    }
  5. JAX-RS ルート・リソースを変更して、com.example.jaxrs.Data タイプ用の @javax.inject.Inject アノテーション付きフィールドを追加します。 以下の例は、@javax.inject.Inject 注入ポイントを追加して 変更した JAX-RS ルート・リソース・クラスを示しています。
    package com.example.jaxrs;
    
    @javax.ws.rs.Path("exampleWithInjection")
    @javax.enterprise.context.RequestScoped
    public class StringResource {
    
        @javax.ws.rs.GET
        @javax.ws.rs.Produces(javax.ws.rs.core.MediaType.TEXT_PLAIN)
        public String get() {
            return myData.getData();
        }
    
        @javax.inject.Inject
        private Data myData;
    }

    実行時に JAX-RS ルート・リソースが構成される際に、 Data タイプのインスタンスが myData フィールドに注入されます。これは注入の単純な形式ですが、JCDI は、より複雑なユース・ケースにも対応できます。詳しくは、 JCDI の仕様を参照してください。

  6. Servlet 3.0 web.xml ファイルを WAR ファイルに追加します。 以下の例では、すべての JAX-RS ルート・リソースを /rest/* URL パターンで 使用できるようにするデフォルトの JAX-RS アプリケーション・サーブレット定義が追加されています。
    <?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>

タスクの結果

JCDI を使用するように Web アプリケーションを構成し、 JCDI ライフサイクル・スコープを使用した JAX-RS リソース、および標準の注入ポイントを作成しました。

タスク・トピック    

インフォメーション・センターに関するご使用条件 | フィードバック

最終更新: October 28, 2014 05:45 PM EDT
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-nd-mp&topic=twbs_jaxrs_jcdi_depinjection
ファイル名: twbs_jaxrs_jcdi_depinjection.html