JAX-RS 2.0 の動作の変更

JAX-RS 2.0 実装には、いくつかの動作変更が含まれています。アプリケーションを JAX-RS 1.1 からアップグレードした場合、これらの変更により、JAX-RS 2.0 でアプリケーションが異なる動作をしたり、失敗したりする可能性があります。

以下のリストでは、JAX-RS 1.1 と JAX-RS 2.0 の相違点について説明しています。
  • JAX-RS 1.1 および Jersey では、EJB クラスまたは CDI クラスが、JAX-RS application.getSingletons() メソッドによって返される新しいインスタンスを作成すると、エンジンは返されたインスタンスを使用し、EJB または CDI のコンテナーのインスタンスへのアクセスを試行しません。JAX-RS 2.0 では、同じシナリオの場合、エンジンは EJB または CDI のコンテナーのインスタンスにアクセスしようとします。インスタンスにアクセスできると、取得されたインスタンスが使用されます。しかし、そのインスタンスにアクセスできない場合は、getSingletons() メソッドから返されたインスタンスが使用されます。以下に例を示します。
    @Override
    public SetObject getSingletons(){
        SetObject objs = new HashSetObject();
        objs.add(new CDIInjectResource());
        objs.add(new EJBInjectResource());
        return objs;
    }
  • JAX-RS 2.0 には、MultiPart ファイルを処理する際の、多くの API の変更が含まれています。例えば、JAX-RS 1.1 では、@FormParam を使用して MultiPart ファイルを処理できますが、JAX-RS 2.0 では、MultiPart ファイルの処理に使用できるのは @IMultipartBody または @IAttachment のみになります。詳細情報については、JAX-RS 2.0 で HTML フォームの実行依頼から multipart/form-data パーツを受信するためのリソースの構成を参照してください。
  • JAX-RS 1.1 でサード・パーティー API として表示される jackson パッケージは、JAX-RS 2.0 では表示されなくなりました。ご使用のアプリケーションでいずれかの org.codehaus.jackson API を使用する場合は、jackson パッケージを圧縮してアプリケーションに含める必要があります。
  • web.xml ファイルにサーブレット名として javax.ws.rs.core.Application を指定した場合、@Context によって注入される、アプリケーション・オブジェクト内の getClasses メソッドは、リソース・クラスを返しません。
    	
           <servlet>
    				<servlet-name>javax.ws.rs.core.Application</servlet-name>
    	</servlet>
    	<servlet-mapping>
    				<servlet-name>javax.ws.rs.core.Application</servlet-name>
    		<url-pattern>/*</url-pattern>
    	</servlet-mapping>
  • JAX-RS 2.0 仕様の規定では、プロバイダーとは、 1 つ以上の JAX-RS インターフェースを実装し、自動ディスカバリーのために @Provider のアノテーションを付けられるクラスです。このシナリオでは、クラスにはプロバイダー・インターフェースを参照する @Local アノテーションが付いていますが、POJO プロバイダー・インターフェースを実装していないため、無効なプロバイダーということになります。以下に例を示します。
    @Stateless
    @Local(OneLocalInterfaceMyOtherStuffMessageBodyWriter.class)
    public class OneLocalInterfaceMyOtherStuffProvide
  • MessageBodyReader および MessageBodyWriter の @Consumes アノテーションと @Produces アノテーションを使用する場合、一部のサポートされるメディア・タイプが制限されることがあります。isReadable メソッドまたは isWriteable メソッドを使用してメディア・タイプを確認してください。以下に例を示します。
    @Provider
    @Consumes("<custom/type>")
    @Produces("<custom/type>")
    @Singleton
    public class MyMessageBodyReaderAndWriter implements MessageBodyReader,MessageBodyWriter {
                    
        public boolean isReadable(Class<?> type, 
                                  Type genericType,
                                  Annotation[] annotations,
                                  MediaType mediaType) { 
            if (mediaType.toString().equals("<custom/type>"))
                return true;
            return false;
        }
    
         public boolean isWriteable(Class<?> type,
                                  Type genericType,
                                  Annotation[] annotations,
                                  MediaType mediaType) { 
            if (mediaType.toString().equals("<custom/type>"))
                return true;
            return false;
        }
    ...
    }
  • JAX-RS 2.0 では非同期処理を使用してスレッドを処理できます。詳しくは、非同期処理を参照してください。
  • JAX-RS 1.1 にサード・パーティー API として表示される Wink API は、JAX-RS 2.0 ではサポートされません。以下に一部をリストします。
    • org.apache.wink.common.model.atom.AtomEntry。JAX-RS 2.0 と Atom との統合について詳しくは、JAX-RS 2.0 と Atom の統合を参照してください。
    • org.apache.wink.client.handlers.BasicAuthSecurityHandler。JAX-RS 2.0 で基本認証を使用する場合、以下のコード・スニペットを参照してください。
      1. 以下のコード例に示すように、JAX-RS 2.0 標準クライアント API を介して ClientRequestFilter を使用します。
        import java.io.IOException;
        import java.io.UnsupportedEncodingException;
        import javax.ws.rs.client.ClientRequestContext;
        import javax.ws.rs.client.ClientRequestFilter;
        import javax.ws.rs.core.MultivaluedMap;
        import javax.xml.bind.DatatypeConverter;
        
        public class BasicAuthFilter implements ClientRequestFilter {
        
            private final String usr;
            private final String pwd;
        
            public BasicAuthFilter(String usr, String pwd) {
                this.usr = user;
                this.pwd = pwd;
            }
        
            public void filter(ClientRequestContext requestContext) throws IOException {
                MultivaluedMap<String, Object> headers = requestContext.getHeaders();
               
             String token = this.usr + ":" + this.pwd;
             final String basicAuthentication ="Basic " + DatatypeConverter.printBase64Binary(token.getBytes("UTF-8"));
             headers.add("Authorization", basicAuthentication);
            }
        }
      2. 以下のように、ClientBuilder に登録します。
        ClientBuilder cb = ClientBuilder.newBuilder();
        cb.register(new BasicAuthFilter("user","password"));
    • org.apache.wink.client.handlers.LtpaAuthSecurityHandlerLTPA ベースのセキュリティー・クライアントを使用してダウンストリーム・リソースを保護するには、ダウンストリーム JAX-RS リソースの保護を参照してください。
    • org.apache.wink.server.internal.providers.exception.EJBAccessExceptionMapper。 この API は、Wink 指定の ExceptionMapper であるため、サポートされなくなりました。EJBAccessException をマップする独自の ExceptionMapper を定義できます。
    • com.ibm.websphere.jaxrs.server.IBMRestFilter。この API は、Wink フィルターに基づいているため、サポートされなくなりました。
    注: アプリケーション内に Wink の JAR パッケージがあるかどうか検出します。アプリケーション内に Wink パッケージがある場合は、以下のステップを実行する必要があります。
    1. Application サブクラスが定義されていることを確認します。
    2. getClasses および getSingletons の少なくとも 1 つでヌルが返されない必要があります。
  • JAX-RS 2.0 クライアントで使用できる、サポートされるクライアント・プロパティーについて詳しくは、JAX-RS 2.0 クライアントの構成を参照してください。
  • JAX-RS 2.0 で Secure Sockets Layer (SSL) 機能を使用する場合は、以下のステップを実行してください。
    1. WebSphere® Application Server traditional 管理コンソールで SSL プロパティーを構成します。

      詳しくは、 Secure Sockets Layer 構成の作成を参照してください。

    2. JAX-RS アプリケーションに対してセキュリティーを有効にし、REST リソースを呼び出す際にトランスポートに SSL チャネルを使用するようにアプリケーションを構成します。

      アプリケーションを開発またはデプロイするときに、web.xml ファイルを編集し、リソースに対して SSL の使用を必須とするセキュリティー制約を追加します。アプリケーションに対する SSL の有効化についての詳細は、Web コンテナー内での JAX-RS アプリケーションの保護に関する情報を参照してください。

      security-constraint エレメント内の以下のエレメントは、アプリケーションに対して SSL を強制するように指定します。
      <user-data-constraint id="UserDataConstraint_1">
          <transport-guarantee>CONFIDENTIAL</transport-guarantee>
       </user-data-constraint>
    3. クライアント・アプリケーションを開発する際にクライアント SSL を 使用可能にするには、クライアント・アプリケーション・コードにクライアント・プロパティーを追加します。

      クライアント・プロパティーのキーを com.ibm.ws.jaxrs.client.ssl.config に、その値を true に設定します。参考として以下のコード・スニペットを参照してください。

      ClientBuilder cb = ClientBuilder.newBuilder();
      cb.property("com.ibm.ws.jaxrs.client.ssl.config", "NodeDefaultSSLSettings");
      ヒント: このプロパティー値は、設定したサーバー SSL 別名と同じものにします。詳細については、「アプリケーション・サーバー」->「サーバー n」(ここで、n は、アプリケーション・サーバーに割り当てた番号) ->「Web コンテナー・トランスポート・チェーン」->「WCInboundDefaultSecure」->「SSL インバウンド・チャネル (SSL_2)」にアクセスして、「SSL 構成」フィールドを確認します。
    4. 管理コンソールを使用して、WebSphere Application Server traditional にご使用のクライアント・アプリケーションをデプロイします。
    5. WebSphere Application Server traditional 管理コンソールでクライアント・アプリケーションを開始します。

      アプリケーションを開始するには、「アプリケーション」->「アプリケーション・タイプ」->「WebSphere エンタープライズ・アプリケーション」->「開始」を選択します。

注: クライアント API およびサーバー API での非同期処理について詳しくは、「JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services」(「仕様」) の第 8 章を参照してください。

トピックのタイプを示すアイコン 概念トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxrs_behavior
ファイル名:twbs_jaxrs_behavior.html