
![[8.5.5.6 以降]](../ng_v8556.gif)
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 1.1 のサード・パーティー API として公開されている jackson パッケージは、JAX-RS 2.0 では公開されなくなっています。ご使用のアプリケーションでいずれかの org.codehaus.jackson API を使用する場合は、jackson パッケージを圧縮してアプリケーションに含める必要があります。
- web.xml ファイルでサーブレット名として javax.ws.rs.core.Application を指定した場合、@Context によって注入された Application オブジェクトの 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 仕様の規定では、プロバイダーとは、自動ディスカバリーのために @Provider のアノテーションが付けられる可能性があるクラスであり、かつ 1 つ以上の JAX-RS インターフェースを実装したクラスです。クラスにプロバイダー・インターフェースを参照する @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 の非同期処理を使用してスレッドを処理できます。詳細については、『非同期処理』を参照してください。
- サード・パーティー API として公開されている Wink API はいずれもサポートされません。以下のリストでは、サポートされない Wink API (ただし、これに限定されない) について説明します。
- org.apache.wink.common.model.atom.AtomEntry。JAX-RS 2.0 では、API は、Wink ランタイムに基づいて応答します。
- 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 フィルターに基づいているため、サポートされなくなりました。
- JAX-RS 2.0 クライアントで使用できるサポートされるクライアント・プロパティーについて詳しくは、『JAX-RS 2.0 クライアントの構成』を参照してください。
- JAX-RS 2.0 の Secure Sockets Layer (SSL) 機能を使用する場合は、以下のステップを実行します。
- ssl-1.0 フィーチャーまたは appSecurity-2.0 フィーチャーを有効にします。LTPA トークン機能の場合、appSecurity-2.0 フィーチャーが必須です。注: ssl-1.0 フィーチャーは、appSecurity-2.0 フィーチャーのサブフィーチャーです。jaxrsClient-2.0 フィーチャーと ssl-1.0 フィーチャーを有効にした場合、appSecurity-2.0 フィーチャーも自動的に有効になります。
- 次のようにして、JAX-RS 2.0 クライアント・コードで com.ibm.ws.jaxrs.client.ssl.config プロパティーを有効にします。
ClientBuilder cb = ClientBuilder.newBuilder(); Client c = cb.build(); c.property("com.ibm.ws.jaxrs.client.ssl.config", "mySSLConfig"); //mySSLConfig is the ssl ref id in Liberty server.xml
注: このプロパティーは、ClientBuilder、Client、および WebTarget のスコープに Liberty SSL 構成をバインドできます。
- ssl-1.0 フィーチャーまたは appSecurity-2.0 フィーチャーを有効にします。LTPA トークン機能の場合、appSecurity-2.0 フィーチャーが必須です。
- JAX-RS 2.0 サーバー・ランタイムで Wink クライアントを使用する場合は、以下のステップを実行します。
- http://wink.apache.org/downloads.html から Apache Wink および関連 JAR ファイルをダウンロードします。
- http://hc.apache.org/ から Apache HTTP および関連 JAR ファイルをダウンロードします。
注: JAX-RS 2.0 フィーチャーが有効になっていない場合、JAX-RS API をダウンロードしてサード・パーティー・ライブラリーに追加する必要もあります。https://jax-rs-spec.java.net/nonav/ から API をダウンロードします。- <third-party lib> ディレクトリーにすべての JAR ファイルを保存します。
- server.xml ファイルに <third-party lib> のロケーションを追加します。
<library id="thirdPartyLib"> <fileset dir=" <third-party lib>" includes="*.jar" scanInterval="5s"/> </library> <enterpriseApplication id="<Your Ear ID>" location="<Your Ear Name>" name="<Your Ear Name>"> <classloader commonLibraryRef="thirdPartyLib"/> </enterpriseApplication>
注: クライアント API およびサーバー API での非同期処理について詳しくは、「JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services」(「仕様」) の第 8 章を参照してください。