Spring WebFluxで404を返す方法

1. 概要

Spring Boot 2と新しいノンブロッキングサーバーNettyでは、サーブレットコンテキストAPIはもうないので、新しいスタックを使用して異なる種類のHTTPステータスコードを表現する方法を説明しましょう。

2. セマンティックレスポンスステータス

標準のRESTfulプラクティスに従ってください。APIのセマンティクスを適切に表現するために、すべてのHTTPステータスコードを使用する必要があります。

2.1. デフォルトの返品ステータス

もちろん、すべてがうまくいくと、デフォルトの応答ステータスは* 200(OK)*になります。
@GetMapping(
  value = "/ok",
  produces = MediaType.APPLICATION_JSON_UTF8_VALUE
)
public Flux<String> ok() {
    return Flux.just("ok");
}

2.2. 注釈を使用する

メソッドに_ @ ResponseStatus_注釈を追加して、デフォルトの戻りステータスを変更できます。
@GetMapping(
  value = "/no-content",
  produces = MediaType.APPLICATION_JSON_UTF8_VALUE
)
@ResponseStatus(HttpStatus.NO_CONTENT)
public Flux<String> noContent() {
    return Flux.empty();
}

2.3. プログラムによるステータスの変更

場合によっては、サーバーの動作に応じて、デフォルトまたはアノテーションで使用される接頭辞付きの返されたステータスの代わりに、返されたステータスをプログラムで変更することを決定できます。
メソッドに__ServerHttpResponse __を注入することで、直接メソッドを実現できます。
@GetMapping(
  value = "/accepted",
  produces = MediaType.APPLICATION_JSON_UTF8_VALUE
)
public Flux<String> accepted(ServerHttpResponse response) {
    response.setStatusCode(HttpStatus.ACCEPTED);
    return Flux.just("accepted");
}
これで、実装で返すHTTPステータスコードを選択できます。

2.4. 例外を投げる

例外をスローするたびに、デフォルトのHTTP戻りステータスは省略され、Springはそれに対処する例外ハンドラーを見つけようとします。
@GetMapping(
  value = "/bad-request"
)
public Mono<String> badRequest() {
    return Mono.error(new IllegalArgumentException());
}
@ResponseStatus(
  value = HttpStatus.BAD_REQUEST,
  reason = "Illegal arguments")
@ExceptionHandler(IllegalArgumentException.class)
public void illegalArgumentHandler() {
    //
}
その方法の詳細については、https://www.baeldung.com/exception-handling-for-rest-with-spring [Baeldungのエラー処理記事]を確認してください。

2.5. _ResponseEntity_を使用

興味深い代替手段、â_ResponseEntity_クラスを簡単に見てみましょう。
これにより、非常に便利な流APIなAPIを使用して、返すHTTPステータスを選択したり、応答をさらにカスタマイズしたりできます。
@GetMapping(
  value = "/unauthorized"
)
public ResponseEntity<Mono<String>> unathorized() {
    return ResponseEntity
      .status(HttpStatus.UNAUTHORIZED)
      .header("X-Reason", "user-invalid")
      .body(Mono.just("unauthorized"));
}

2.6. 機能エンドポイントを使用

Spring 5では、機能的な方法でエンドポイントを定義できるため、デフォルトのHTTPステータスもプログラムで変更できます。
@Bean
public RouterFunction<ServerResponse> notFound() {
    return RouterFunctions
      .route(GET("/statuses/not-found"),
         request -> ServerResponse.notFound().build());
}

3. 結論

HTTP APIを実装する場合、フレームワークは、クライアントに公開しているステータスコードをインテリジェントに処理するための多くのオプションを提供します。
この記事は、これらを調査し、表現力豊かで使いやすいAPIを、クリーンでRESTfulなセマンティクスで展開する方法を理解するための良い出発点となるはずです。
もちろん、このチュートリアルで使用される完全なコード例は、https://github.com/eugenp/tutorials/tree/master/spring-5-webflux [Github上]で入手できます。