MVCRESTサービスの一般的な要件は、応答の本文にエラーの詳細を含めることです。Frameworkは、応答本文のエラー詳細の表現がアプリケーション固有であるため、自動的にそうしません。メソッドを使用して、応答のステータスと本文を設定できます。クラスで宣言して、グローバルに適用することもできます。ResponseEntityExceptionHandlerに相当するものがないことに注意してください。(またはそのサブクラス)のみを生成し、HTTPステータスコードに変換する必要がないためです。クラス(またはクラス階層)内で適用されます。@RestControllerAdviceアノテーションが付けられたクラスで宣言できます。@Componentのアノテーションが付いています。Beanとして登録できることを意味します。@ResponseBodyの両方でアノテーションが付けられた合成アノテーションです。メソッドがメッセージ変換(ビューの解像度またはテンプレートのレンダリングに対して)によって応答本文にレンダリングされることを意味します。Beanを検出し、実行時にそれらのメソッドを適用します。@Controllerから)の後に適用されます。メソッドは、ローカルメソッドの前に適用されます。メソッドはすべてのリクエスト(つまり、すべてのコントローラー)に適用されますが、次の例に示すように、アノテーションの属性を使用してコントローラーのサブセットに絞り込むことができます。{}前の例のセレクターは実行時に評価され、広範囲に使用するとパフォーマンスに悪影響を与える可能性があります。javadocを参照してください。WebFluxには、WebFlux.fnが含まれています。WebFlux.fnは、機能を使用して要求のルーティングと処理を行い、契約は不変性のために設計されています。これは、アノテーションベースのプログラミングモデルに代わるものですが、それ以外は同じリアクティブコア基盤で実行されます。次の例に示すように、ルーターの作成を容易にするルータービルダーを提供します。CoroutinesルーターDSLを使用してルーターを作成します。}を介して使用できます。1つを介してインストールすることです。Java構成を介して実行できます。サーバーの実行を参照してください。8フレンドリーなアクセスを提供する不変のインターフェースです。バックプレッシャーを提供します。Monoで表されます。Publisherで表されます。詳細については、リアクティブライブラリを参照してください。メソッドを介して提供されます。Mono<String>に抽出します。)にボディを抽出します。オブジェクトは、JSONやXMLなどの直列化された形式からデコードされます。機能戦略インターフェースを受け入れます。多数のインスタンスへのアクセスを提供します。例:上記の例は、次のように書くこともできます。request.body(BodyExtractors.toFlux(Person::class.java)).asFlow()次の例は、フォームデータにアクセスする方法を示しています。request.awaitFormData()次の例は、マップとしてマルチパートデータにアクセスする方法を示しています。request.awaitMultipartData()次の例は、ストリーミング方式で一度に1つずつマルチパートにアクセスする方法を示しています。HTTPレスポンスへのアクセスを提供します。メソッドを使用してHTTPレスポンスを作成できます。ビルダーを使用して、応答ステータスを設定したり、応答ヘッダーを追加したり、本文を提供したりできます。次の例では、JSONコンテンツで200(OK)応答を作成します。ヘッダーを持ち、本文がない201(CREATED)応答を作成する方法を示しています。...ServerResponse.created(location).build()使用されるコーデックに応じて、ヒントパラメータを渡して、本体の直列化または逆直列化の方法をカスタマイズできます。MyJacksonView::class.java).body(...)ハンドラークラス次の例に示すように、ハンドラー関数をラムダとして記述できます。}これは便利ですが、アプリケーションでは複数の関数が必要であり、複数のインラインラムダが乱雑になる可能性があります。同様のロールを持つハンドラークラスにグループ化すると便利です。リポジトリを公開します。オブジェクトをJSONとして返すハンドラー関数です。保存するハンドラー関数です。Mono<Void>を返すことに注意してください。要求から人が読み取られて保管されたときに完了シグナルを発行します。保存されたとき)に応答を送信します。パス変数で識別される1人の人物を返すハンドラー関数です。リポジトリから取得し、見つかった場合はJSONレスポンスを作成します。未検出応答を返します。オブジェクトをJSONとして返すハンドラー関数です。保存するハンドラー関数です。戻り値のない一時停止関数であることに注意してください。パス変数で識別される1人の人物を返すハンドラー関数です。リポジトリから取得し、見つかった場合はJSONレスポンスを作成します。未検出レスポンスを返します。機能エンドポイントは、Springの検証機能を使用して、要求本文に検証を適用できます。インスタンスを作成します。400応答に対して例外を発生させます。インスタンスを作成します。400応答に対して例外を発生させます。インスタンスを作成および注入することにより、標準Bean検証API(JSR-303)を使用することもできます。Spring検証を参照してください。HandlerFunctionにルーティングします。ユーティリティクラスのメソッドを使用して作成します。ルーターを直接作成する方法を提供します。ビルダーを使用することをお勧めします。これは、検出が困難な静的インポートを必要とせずに、一般的なマッピングシナリオに便利なショートカットを提供するためです。HandlerFunction)。HTTPメソッドベースのマッピングに加えて、ルートビルダーは、要求にマッピングするときに追加の述語を導入する方法を提供します。パラメーターとして受け取るオーバーロードされたバリアントがありますが、追加の制約を表現できます。ユーティリティクラスは、リクエストパス、HTTPメソッド、コンテンツタイプなどに基づいて、一般的に使用される実装を提供します。ヘッダーに基づいて制約を作成します。}}以下を使用して、複数の要求述語を一緒に作成できます。述部の多くが構成されています。RequestPredicates.path(String)から構成されています。述語で構成しているため、2つの要求述語も使用しています。複数のルーター関数を一緒に構成する他の方法もあります。.次の例は、4つのルートの構成を示しています。他の場所で作成され、構築されたルートに追加されるルーター関数です。他の場所で作成され、構築されたルートに追加されるルーター関数です。ネストされたルートルーター関数のグループが共有述語(共有パスなど)を持つことは一般的です。/personに一致するパス述語になります。アノテーションを使用して、この重複を削除します。メソッドを介して共有できます。上記の例の最後の数行は、ネストされたルートを使用して次のように改善できます。2番目のパラメーターは、ルータービルダーを使用するコンシューマーであることに注意してください。メソッドを使用して、あらゆる種類の述語にネストできます。-header述部の形式での重複がまだ含まれています。acceptを併用すると、さらに改善できます。多数のサーバーアダプターで使用できます。ベースのセットアップで実行することです。WebFlux構成は、Spring構成を使用して、要求の処理に必要なコンポーネントを宣言します。Java構成は、機能エンドポイントをサポートするために次のインフラストラクチャコンポーネントを宣言します。RouterFunctionに要求をルーティングします。呼び出せるようにする単純なアダプター。呼び出しからの結果を処理します。要求処理ライフサイクルに適合し、アノテーション付きコントローラー(存在する場合)と並行して(潜在的に)実行されます。WebFluxスターターが機能エンドポイントを有効にする方法でもあります。Java構成を示しています(実行方法については、DispatcherHandlerを参照してください)。メソッドを使用して、ハンドラー関数をフィルター処理できます。アノテーションを使用すると、@ControllerAdvice、ServletFilter、またはその両方を使用して同様の機能を実現できます。フィルターは、ビルダーによって構築されたすべてのルートに適用されます。これは、ネストされたルートで定義されたフィルターが「トップレベル」ルートに適用されないことを意味します。次の例を考えてみましょう。フィルターは、2つのGETルートにのみ適用されます。フィルターは、ネストされたものを含むすべてのルートに適用されます。フィルターは、2つのGETルートにのみ適用されます。フィルターは、ネストされたものを含むすべてのルートに適用されます。あると仮定して、ルートに簡単なセキュリティフィルターを追加できます。次の例は、その方法を示しています。呼び出しがオプションであることを示しています。アクセスが許可されている場合、ハンドラー関数のみを実行できます。メソッドを使用する以外に、RouterFunction.filter(HandlerFilterFunction)を介して既存のルーター関数にフィルターを適用することができます。Frameworkで使用可能なさまざまなオプションについて説明します。次の例に示すように、変数を持つURIテンプレートからURIを作成できます。URIテンプレートを使用した静的ファクトリメソッド。URIコンポーネントを追加または置換します。URIテンプレートとURI変数をエンコードするよう要求します。UriComponentsをビルドします。変数を展開し、URIを取得します。URIテンプレートを使用した静的ファクトリメソッド。URIコンポーネントを追加または置換します。URIテンプレートとURI変数をエンコードするよう要求します。UriComponentsをビルドします。変数を展開し、URIを取得します。前述の例は、次の例に示すように、1つのチェーンに統合し、buildAndExpandで短縮できます。.toUri()次の例に示すように、URIに直接移動することで(エンコードを暗示する)、さらに短くすることができます。"123")次の例に示すように、完全なURIテンプレートを使用してさらに短くします。UriBuilderを実装しています。UriBuilderFactoryを使用して、UriBuilderを作成できます。ベースURL、エンコード設定、その他の詳細などの共有構成に基づいて、URIテンプレートからURIを構築するプラグ可能なメカニズムを提供します。構成して、URIの準備をカスタマイズできます。次の例は、RestTemplateを構成する方法を示しています。factory次の例では、WebClientを構成します。使用することもできます。使用に似ていますが、次の例に示すように、静的ファクトリーメソッドの代わりに、構成と設定を保持する実際のインスタンスです。2つのレベルでエンコードオプションを公開します。最初にURIテンプレートを事前にエンコードし、次に展開時にURI変数を厳密にエンコードします。URIコンポーネントをエンコードします。どちらのオプションも、非ASCII文字と不正な文字をエスケープされたオクテットに置き換えます。最初のオプションは、URI変数に表示される予約された意味で文字を置き換えます。「;」を検討してください。これはパスでは有効ですが、意味は予約されています。最初のオプションは「;」を置き換えます。URI変数には「%3B」が含まれますが、URIテンプレートには含まれません。対照的に、2番目のオプションはパス内の正当な文字であるため、「;」を置き換えることはありません。ほとんどの場合、最初のオプションはURI変数を完全にエンコードされる不透明なデータとして扱うため、期待される結果が得られる可能性がありますが、オプション2はURI変数に意図的に予約文字が含まれている場合にのみ役立ちます。次の例では、最初のオプションを使用しています。"/hotel%20list/New%20York?q=foo%2Bbar"次の例に示すように、URIに直接移動することで、前述の例を短縮できます(エンコードを意味します)。"foo+bar")次の例に示すように、完全なURIテンプレートを使用してさらに短縮できます。戦略により内部的にURIテンプレートを展開およびエンコードします。どちらもカスタム戦略で構成できます。内部的に使用してURIテンプレートを展開およびエンコードします。ファクトリーとして、以下のエンコードモードのいずれかに基づいて、エンコードへのアプローチを構成する単一の場所を提供します。UriComponentsBuilder#encode()を使用して、URIテンプレートを事前エンコードし、展開時にURI変数を厳密にエンコードします。使用してURI変数をテンプレートに展開する前にURI変数に厳密なエンコードを適用します。URIコンポーネント値をエンコードします。エンコードは適用されません。DefaultUriBuilderFactoryのデフォルト値に依存しています。WebFluxを使用すると、CORS(クロスオリジンリソース共有)を処理できます。このセクションでは、その方法について説明します。MVCセキュリティ上の理由から、ブラウザは現在のオリジンの外部のリソースへのAJAX呼び出しを禁止しています。例:銀行口座を1つのタブに、evil.comを別のタブに持つことができます。あり、IFRAMEまたはJSONPに基づく安全性が低く、強力ではない回避策を使用するのではなく、認可される種類のクロスドメインリクエストを指定できます。MVCCORS仕様は、プリフライト、シンプル、および実際のリクエストを区別します。読むか、詳細について仕様を参照してください。実装は、CORSの組み込みサポートを提供します。指定されたリクエストとハンドラーのCORS設定をチェックし、さらにアクションを実行します。プリフライトリクエストは直接処理されますが、シンプルで実際のCORSリクエストはインターセプトされ、検証され、必要なCORSレスポンスヘッダーが設定されます。ヘッダーが存在し、リクエストのホストとは異なる)、明示的に宣言されたCORS構成が必要です。一致するCORS設定が見つからない場合、プリフライトリクエストは拒否されます。CORSヘッダーは単純および実際のCORS要求の応答に追加されないため、ブラウザーはそれらを拒否します。Java構成を使用してこのようなマッピングを宣言します。レベルのグローバルCORS構成と、よりきめ細かいハンドラーレベルのCORS構成を組み合わせることができます。CorsConfigurationSourceを実装できます)。details.ソースから詳細を確認するか、高度なカスタマイズを行うには、次を参照してください。アノテーションは、次の例に示すように、アノテーション付きコントローラーメソッドでクロスオリジンリクエストを有効にします。