3

クライアントが application/xml の Accept ヘッダーを使用して application/json コンテンツを生成するリソースを要求した場合。リクエストは HttpMediaTypeNotAcceptableException 例外で失敗し、以下のコードで説明されているように、例外ハンドラー アノテーションを使用して、レスポンス エンティティ オブジェクトのエラー メッセージ本文にラップされます。ただし、HttpMessageConverter でレスポンスに戻り値を書き込むと、再度 HttpMediaTypeNotAcceptableException を受け取ります。これは、許容可能なリクエスト タイプのレスポンスに対して生成可能なコンテンツ タイプをチェックするためですが、これはまさに、エラー メッセージを使用してクライアントに伝えようとしているものです。この問題を回避するにはどうすればよいですか? ところで、他のすべての例外はエラーメッセージにうまく解析されています。お知らせ下さい。

@ControllerAdvice
    public class RestExceptionHandler extends ResponseEntityExceptionHandler {

     @Override
      protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body,
          HttpHeaders headers, HttpStatus status, WebRequest request) {
          // Setting the response content type to json
          headers.setContentType(MediaType.APPLICATION_JSON);
        return ResponseEntity.status(status).headers(headers).body(body);
      }
    }
4

2 に答える 2

0

いくつかの選択肢が頭に浮かびます。1 つは、コントローラー メソッドがすべてのコンテンツ タイプを生成し、そのコンテンツ タイプが予期したものと異なる場合にメソッドで例外をスローすると、例外ハンドラーがこの例外を取得して変換できることです。例外ハンドラーはコントローラーメソッドで生成された例外のみを処理するため、例外ハンドラーで機能するのはこれだけです。

その他のオプションは次のとおりです。

  • インターセプターを使用します (ただし、Spring はインターセプターを呼び出すのではなく、最初にコントローラー メソッドを解決しようとする可能性があるため、これが機能するかどうかはわかりません)。
  • RequestMappingHandlerMapping適切なメソッドが見つからない場合は、例外ハンドラーを呼び出すように拡張します。おそらくメソッドをオーバーライドする必要がありますhandleNoMatch。そこでは、のリストへの参照を取得する必要がありますHandlerExceptionResolver

最初のものは理解するのが最も簡単で、最新のものは最も「拡張可能」かもしれませんが、Spring の内部についてある程度理解する必要があります。

于 2015-08-07T20:09:22.587 に答える