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 で基本認証を使用する場合、以下のコード・スニペットを参照してください。
- 以下のコード例に示すように、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); } }
- 以下のように、ClientBuilder に登録します。
ClientBuilder cb = ClientBuilder.newBuilder(); cb.register(new BasicAuthFilter("user","password"));
- 以下のコード例に示すように、JAX-RS 2.0 標準クライアント API を介して ClientRequestFilter を使用します。
- org.apache.wink.client.handlers.LtpaAuthSecurityHandler。LTPA ベースのセキュリティー・クライアントを使用してダウンストリーム・リソースを保護するには、ダウンストリーム 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 パッケージがある場合は、以下のステップを実行する必要があります。- Application サブクラスが定義されていることを確認します。
- getClasses および getSingletons の少なくとも 1 つでヌルが返されない必要があります。
- JAX-RS 2.0 クライアントで使用できる、サポートされるクライアント・プロパティーについて詳しくは、JAX-RS 2.0 クライアントの構成を参照してください。
- JAX-RS 2.0 で Secure Sockets Layer (SSL) 機能を使用する場合は、以下のステップを実行してください。
- WebSphere® Application Server traditional 管理コンソールで SSL プロパティーを構成します。
詳しくは、 Secure Sockets Layer 構成の作成を参照してください。
- 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>
- クライアント・アプリケーションを開発する際にクライアント 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 構成」フィールドを確認します。 - 管理コンソールを使用して、WebSphere Application Server traditional にご使用のクライアント・アプリケーションをデプロイします。
- WebSphere Application Server traditional 管理コンソールでクライアント・アプリケーションを開始します。
アプリケーションを開始するには、「アプリケーション」->「アプリケーション・タイプ」->「WebSphere エンタープライズ・アプリケーション」->「開始」を選択します。
- WebSphere® Application Server traditional 管理コンソールで SSL プロパティーを構成します。
注: クライアント API およびサーバー API での非同期処理について詳しくは、「JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services」(「仕様」) の第 8 章を参照してください。