7.4. Jakarta RESTful Web サービスと RESTEasy アプリケーションの変更
JBoss EAP 6 は、JAX-RS 1.x の実装であった RESTEasy 2 をバンドルしました。
JBoss EAP 7 および JBoss EAP 7.1 には、JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services 仕様で定義されている JAX-RS 2.0 の実装である RESTEasy 3.0.x が含まれていました。
JBoss EAP 7.4 には、Jakarta RESTful Web Services 2.1 の実装である RESTEasy 3.15 が含まれています。このリリースでは、JDK 11 のサポートも追加されています。本リリースは RESTEasy 4 の主な機能の一部を提供しますが、ベースは RESTEasy 3.0 で、後方互換性を完全に維持します。そのため、RESTEasy 3.0 から RESTEasy 3.15 への移行の際は、問題がほとんど生しないはずです。Java API for RESTEasy 3.15 の詳細は、RESTEasy Jakarta RESTful Web Services 3.15.0.Final API を参照してください。
JBoss EAP 8.0 は、Jakarta RESTful Web Services 3.1 specification を実装する RESTEasy 6.2 のサポートを提供します。
JBoss EAP 6.4 から移行する場合、JBoss EAP に含まれる Jackson のバージョンが変更されたことに注意してください。JBoss EAP 6.4 には Jackson 1.9.9 が含まれていました。JBoss EAP 7 以上には Jackson 2.6.3 以上が含まれるようになりました。
このセクションでは、これらの変更が RESTEasy または Jakarta RESTful Web サービスを使用するアプリケーションにどのような影響を与える可能性があるかを説明します。
7.4.1. RESTEasy の非推奨クラス リンクのコピーリンクがクリップボードにコピーされました!
インターセプターおよび MessageBody クラス
JSR 311: JAX-RS: The Java™ API for RESTful Web Services にはインターセプターフレームワークが含まれなかったため、RESTEasy 2 によって提供されました。JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services は、公式のインターセプターおよびフィルターフレームワークを導入したため、RESTEasy 2 に含まれるインターセプターフレームワークは現在非推奨となり、RESTEasy 3.x の Jakarta REST 準拠インターセプター機能に置き換えられました。関連するインターフェイスは、jakarta.ws.rs.api
モジュールの jakarta.ws.rs.ext
パッケージで定義されています。
以下のプロバイダーは JBoss EAP 8.0 で削除されました。
-
org.jboss.resteasy:resteasy-jackson-provider
-
org.jboss.resteasy:resteasy-jettison-provider
-
org.jboss.resteasy:resteasy-yaml-provider
以下は Jakarta RESTful Web Services に置き換えられたため、JBoss EAP 8.0 では削除されました。
-
@Suspend
とorg.jboss.resteasy.spi.AsynchronousResponse
は削除され、それぞれ@Suspended
とjavax.ws.rs.container.AsyncResponse
に置き換えられました。 -
StringConverter
はParamConverter
に置き換えられます。 -
org.jboss.resteasy.plugins.providers.SerializableProvider
は非推奨となり、削除されました。 RESTEasy 3.x で非推奨となった次のインターセプターインターフェイスは削除されました。
-
org.jboss.resteasy.spi.interception.PreProcessInterceptor
インターフェイスは、RESTEasy 3.x のjakarta.ws.rs.container.ContainerRequestFilter
インターフェイスに置き換えられました。 以下のインターフェイスとクラスは、RESTEasy 3.x および JBoss EAP 8.0 から削除されました。
-
org.jboss.resteasy.spi.interception.MessageBodyReaderInterceptor
-
org.jboss.resteasy.spi.interception.MessageBodyWriterInterceptor
-
org.jboss.resteasy.spi.interception.MessageBodyWriterContext
-
org.jboss.resteasy.spi.interception.MessageBodyReaderContext
-
org.jboss.resteasy.core.interception.InterceptorRegistry
-
org.jboss.resteasy.core.interception.InterceptorRegistryListener
-
org.jboss.resteasy.core.interception.ClientExecutionContextImpl
-
-
org.jboss.resteasy.spi.interception.MessageBodyWriterInterceptor
インターフェイスは、jakarta.ws.rs.ext.WriterInterceptor
インターフェイスに置き換えられました。 さらに、
jakarta.ws.rs.ext.MessageBodyWriter
インターフェイスに対する一部の変更は、JAX-RS 1.x に関して下位互換性がない可能性があります。アプリケーションが JAX-RS 1.x を使用した場合はアプリケーションコードを確認し、エンドポイントに@Produces
または@Consumes
を定義するようにしてください。この定義を怠ると、以下のようなエラーが発生することがあります。org.jboss.resteasy.core.NoMessageBodyWriterFoundFailure: Could not find MessageBodyWriter for response object of type: <OBJECT> of media type:
org.jboss.resteasy.core.NoMessageBodyWriterFoundFailure: Could not find MessageBodyWriter for response object of type: <OBJECT> of media type:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下に、このエラーの原因となる REST エンドポイントの例を示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この問題を解決するには、次のように、
jakarta.ws.rs.Produces
のインポートと@Produces
アノテーションを追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
RESTEasy の以前のリリースのすべてのインターセプターは、新しい Jakarta REST フィルターおよびインターセプターインターフェイスと並行して実行できます。
クライアント API
resteasy-jaxrs
の RESTEasy クライアントフレームワークは、JBoss EAP 7.0 で JAX-RS 2.0 準拠の resteasy-client
モジュールに置き換えられました。そのため、RESTEasy クライアント API クラスおよびメソッドの中には非推奨となっているものもあります。
以下のクラスは JBoss EAP 8.0 から削除されました。
-
org.jboss.resteasy.client.ClientResponseFailure
例外、org.jboss.resteasy.client.ClientExecutor
インターフェイスおよびorg.jboss.resteasy.client.EntityTypeFactory
インターフェイスも非推奨になりました。 org.jboss.resteasy.client.ClientRequest
クラスおよびorg.jboss.resteasy.client.ClientResponse
クラスを、それぞれorg.jboss.resteasy.client.jaxrs.ResteasyClient
およびjakarta.ws.rs.core.Response
に置き換える必要があります。以下は RESTEasy 2.3.x の RESTEasy クライアントでリンクヘッダーを送信する例です。
ClientRequest request = new ClientRequest(generateURL("/linkheader/str")); request.addLink("previous chapter", "previous", "http://example.com/TheBook/chapter2", null); ClientResponse response = request.post(); LinkHeader header = response.getLinkHeader();
ClientRequest request = new ClientRequest(generateURL("/linkheader/str")); request.addLink("previous chapter", "previous", "http://example.com/TheBook/chapter2", null); ClientResponse response = request.post(); LinkHeader header = response.getLinkHeader();
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下は RESTEasy 3 の RESTEasy クライアントで上記と同じタスクを実行する例です。
ResteasyClient client = new ResteasyClientBuilder().build(); Response response = client.target(generateURL("/linkheader/str")).request() .header("Link", "<http://example.com/TheBook/chapter2>; rel=\"previous\"; title=\"previous chapter\"").post(Entity.text(new String())); jakarta.ws.rs.core.Link link = response.getLink("previous");
ResteasyClient client = new ResteasyClientBuilder().build(); Response response = client.target(generateURL("/linkheader/str")).request() .header("Link", "<http://example.com/TheBook/chapter2>; rel=\"previous\"; title=\"previous chapter\"").post(Entity.text(new String())); jakarta.ws.rs.core.Link link = response.getLink("previous");
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Jakarta REST Web サービスと対話する外部 Jakarta REST RESTEasy クライアントの例については、
resteasy-jaxrs-client
クイックスタートを参照してください。-
org.jboss.resteasy.client.cache
パッケージのクラスおよびインターフェイスも非推奨になりました。これらはorg.jboss.resteasy.annotations.cache
パッケージ内の同等のクラスとインターフェイスに置き換えられました。
org.jboss.resteasy.client.jaxrs
API クラスの詳細は、RESTEasy Jakarta REST JavaDoc を参照してください。
StringConverter
org.jboss.resteasy.spi.StringConverter
クラスは、RESTEasy 3.x および JBoss EAP 8.0 で非推奨になりました。この機能は、Jakarta REST jakarta.ws.rs.ext.ParamConverterProvider クラスを使用して置き換えることができます。
7.4.2. 削除または保護された RESTEasy クラス リンクのコピーリンクがクリップボードにコピーされました!
ResteasyProviderFactory Add メソッド
RESTEasy 3.0 では、org.jboss.resteasy.spi.ResteasyProviderFactory
add()
メソッドのほとんどが削除または保護されています。たとえば、addBuiltInMessageBodyReader()
および addBuiltInMessageBodyWriter()
メソッドは削除され addMessageBodyReader()
および addMessageBodyWriter()
メソッドは保護されました。
現時点では、registerProvider()
と registerProviderInstance()
のメソッドを使用してください。
RESTEasy 3 から削除された他のクラス
Jakarta REST メソッドへの応答をサーバー上にキャッシュする必要があることを指定した @org.jboss.resteasy.annotations.cache.ServerCached
アノテーションは RESTEasy 3 から削除されたため、アプリケーションコードから削除する必要があります。
7.4.3. 追加の RESTEasy 変更 リンクのコピーリンクがクリップボードにコピーされました!
このセクションでは、JBoss EAP の RESTEasy への追加的な変更点を説明します。
SignedInput および SignedOuput
-
resteasy-crypto
のSignedInput
およびSignedOutput
では、Content-Type
をRequest
またはResponse
オブジェクトのいずれかでmultipart/signed
に設定する必要があります。そうでない場合は、@Consumes
または@Produces
アノテーションを使用する必要があります。 -
SignedOutput
およびSignedInput
を使用すると、@Produces
または@Consumes
アノテーションにタイプを設定することで、application/pkcs7-signature
MIME タイプ形式をバイナリー形式で返すことができます。 -
@Produces
または@Consumes
がtext/plain
MIME タイプの場合、SignedOutput
は base64 でエンコードされ、文字列として送信されます。
セキュリティーフィルター
@RolesAllowed
、@PermitAll
、および @DenyAll
のセキュリティーフィルターは、"401 Unauthorized" ではなく "403 Forbidden" を返すようになりました。
クライアント側のフィルター
RESTEasy 3.0 より前のリリースから RESTEasy クライアント API を使用している場合は、JAX-RS 2.0 で導入されたクライアント側のフィルターはバインドされず、実行されません。
非同期 HTTP サポート
JAX-RS 2.0 仕様は、@Suspended
アノテーションと AsynResponse
インターフェイスを使用した非同期 HTTP サポートを追加したため、非同期 HTTP の RESTEasy プロプライエタリー API は非推奨となりました。非同期 Tomcat モジュールと非同期 JBoss Web モジュールもサーバーインストールから削除されました。非同期 Tomcat と非同期 JBoss Web モジュールもサーバーインストールから削除されています。Servlet 3.0 コンテナーまたはそれ以降を使用していない場合、非同期 HTTP サーバー側の処理がシミュレートされ、同一リクエストスレッドで同期的に実行されます。
サーバー側のキャッシュ
サーバー側のキャッシュ設定が変更されました。詳細は、RESTEasy のドキュメント を参照してください。
YAML プロバイダーの設定変更
以前のリリースの JBoss EAP では、RESTEasy YAML プロバイダー設定はデフォルトで有効になっていました。これは JBoss EAP 7 で変更になりました。YAML プロバイダーがデフォルトで無効化されるようになりました。アンマーシャリングで RESTEasy によって使用される SnakeYAML
ライブラリーにセキュリティー上の問題があるため、YAML プロバイダーの使用はサポートされず、アプリケーションで明示的に有効にする必要があります。アプリケーションで YAML プロバイダーを有効にし、Maven 依存関係を追加する方法は、JBoss EAP 7.4 Web サービスアプリケーションの開発 の YAML プロバイダー を参照してください。
Content-Type ヘッダーのデフォルトの文字セット UTF-8
JBoss EAP 7.1 より、デフォルトで resteasy.add.charset
パラメーターが true
に設定されています。リソースメソッドが明示的な文字セットなしで text/*
または application/xml*
メディアタイプを返すときに、返された content-type ヘッダーに charset=UTF-8
を追加したくない場合は、resteasy.add.charset
パラメーターを false
に設定できます。
テキストメディアタイプと文字セットの詳細は、JBoss EAP 7.4 Web サービスアプリケーションの開発 の テキストメディアタイプおよび文字セット を参照してください。
SerializableProvider
信用できないソースから Java オブジェクトをデシリアライズすることは危険です。そのため、JBoss EAP 7 以降では org.jboss.resteasy.plugins.providers.SerializableProvider
クラスがデフォルトで無効となり、このプロバイダーの使用は推奨されません。
リソースメソッドへのリクエストの一致
RESTEasy 3 では、JAX-RS 仕様の定義どおりに、一致ルールの実装に改善および修正が加えられました。特に、サブリソースメソッドおよびサブリソースロケーターのあいまいな URI の処理方法が変更されました。
RESTEasy 2 では、同じ URI を持つ別のサブリソースが存在していても、サブリソースロケーターが正常に実行される可能性がありました。仕様上ではこの挙動は適切ではありません。
RESTEasy 3 では、サブリソースおよびサブリソースロケーターのあいまいな URI が存在する場合、サブリソースの呼び出しには成功しますが、サブリソースロケーターの呼び出しは HTTP ステータス 405 Method Not Allowed
のエラーによって失敗します。
以下の例には、サブリソースメソッドおよびサブリソースロケーターのあいまいな @Path
アノテーションが含まれています。エンドポイント anotherResource
および anotherResourceLocator
両方の URI は同じであることに注目してください。この 2 つのエンドポイントの違いは、anotherResource
メソッドは REST 動詞である POST
に関連付けられていることです。anotherResourceLocator
メソッドに関連付けられている REST 動詞はありません。仕様上では、REST 動詞を持つエンドポイント (この場合は anotherResource
メソッド) が常に選択されます。
7.4.4. RESTEasy SPI の変更 リンクのコピーリンクがクリップボードにコピーされました!
RESTEasy SPI プロバイダーは JBoss EAP 8 で削除されました。
SPI 例外
すべての SPI 失敗例外は非推奨となり、内部的には使用されません。これらは、対応する Jakarta REST 例外に置き換えられました。
非推奨の例外 | jaxrs-api モジュールでの代替の例外 |
---|---|
org.jboss.resteasy.spi.ForbiddenException | jakarta.ws.rs.ForbiddenException |
org.jboss.resteasy.spi.MethodNotAllowedException | jakarta.ws.rs.NotAllowedException |
org.jboss.resteasy.spi.NotAcceptableException | jakarta.ws.rs.NotAcceptableException |
org.jboss.resteasy.spi.NotFoundException | jakarta.ws.rs.NotFoundException |
org.jboss.resteasy.spi.UnauthorizedException | jakarta.ws.rs.NotAuthorizedException |
org.jboss.resteasy.spi.UnsupportedMediaTypeException | jakarta.ws.rs.NotSupportedException |
InjectorFactory および Registry
InjectorFactory
および Registry
SPI が変更されました。ドキュメントに従ってサポートされるように RESTEasy を使用する場合は、問題はありません。
7.4.5. Jackson プロバイダーの変更 リンクのコピーリンクがクリップボードにコピーされました!
JBoss EAP 6.4 に含まれる Jackson のバージョンが変更されました。JBoss EAP 7 以降、Jackson プロバイダーは resteasy-jackson-provider
から resteasy-jackson2-provider
に変更されました。
resteasy-jackson2-provider
へのアップグレードにはいくつかのパッケージ変更が必要になります。たとえば、Jackson アノテーションパッケージは org.codehaus.jackson.annotate
から com.fasterxml.jackson.annotation
に変更されました。
7.4.6. Spring RESTEasy 統合の変更 リンクのコピーリンクがクリップボードにコピーされました!
JBoss EAP 8.0 は RESTEasy 6.2 のサポートを提供します。JBoss EAP 8.0 で Spring 6.0 フレームワークを使用する予定の場合は、Java 17 を使用する必要があります。
Spring 4.0 フレームワークには、Java 8 のサポートが導入されました。Spring と RESTEasy 3.x 統合を使用する場合は、使用するデプロイメントで最小 Spring バージョンに 4.2.x を指定してください。これは JBoss EAP 7 がサポートする安定性のある最も早期のバージョンです。
7.4.7. RESTEasy Jettison JSON プロバイダーの変更 リンクのコピーリンクがクリップボードにコピーされました!
RESTEasy Jettison JSON プロバイダーは JBoss EAP 7 以降非推奨となり、デフォルトでデプロイメントに追加されなくなりました。推奨される RESTEasy Jackson プロバイダーに切り替えるようにしてください。Jettison プロバイダーの使用継続を希望する場合は、以下の例で示すように jboss-deployment-descriptor.xml
ファイルでその明示的な依存関係を定義する必要があります。
明示的な依存関係を定義する方法の詳細は、JBoss EAP 7.4 開発ガイド の デプロイメントへの明示的なモジュール依存関係の追加 を参照してください。
7.4.8. JBoss EAP の MicroProfile リンクのコピーリンクがクリップボードにコピーされました!
MicroProfile は、開発者がアプリケーションを変更したり再パッケージ化したりすることなく、複数の環境で実行できるようにアプリケーションやマイクロサービスを設定するために使用できる仕様の名前です。以前は、MicroProfile はテクノロジープレビューとして JBoss EAP 7.3 で利用可能でしたが、その後削除されました。MicroProfile は現在、JBoss EAP XP でのみ使用可能です。