API異常処理-DefaultHandlerExceptionResolver
2768 ワード
DefaultHandlerExceptionResolver
DefaultHandlerExceptionResolverは、スプリング内部に発生するスプリング異常を解決します.
代表的には、パラメータバインド時にタイプが一致しない場合、内部にタイプMismatchExceptionが発生します.この場合、例外が発生し、放置するとサーブレットコンテナにエラーが発生し、結果として500エラーが発生します.
しかしParamter Bindingの多くはクライアントがHTTP要求情報を誤って呼び出したことによる問題である.
この場合、HTTPは、HTTPステータスコード400を使用する.
DefaultHandlerExceptionResolverは、500エラーではなくHTTPステータスコード400エラーに変更します.
スプリング内部のエラーをどのように処理するかについては、多くの内容が定義されています.
コードチェック
DefaultHandlerExceptionResolver.handleTypeMismatchを表示すると、次のコードが表示されます.
response.sendError(HttpServletResponse.SC_BAD_REQUEST) (400)
結局は返事だった.問題はsendError()によって解決した.sendError(400)が呼び出されたため、WASは内部エラーページ(/error)を再度要求する.
API Controller
@GetMapping("/api/default-handler-ex")
public String defaultException(@RequestParam Integer data) {
return "OK";
}
Integerデータに文字を入力すると、内部でタイプMismatchExceptionが発生します.http://localhost:8080/api/default-handler-ex?データ=qqq接続結果
元々異常が発生した場合、エラーはサーブレットコンテナに上昇し、500エラーが発生しますが、D e f a ultHandlerExceptionHandlerでは500エラーが400エラーに変換されます.
DefaultHandlerExceptionResolver-内部コード
public class DefaultHandlerExceptionResolver extends AbstractHandlerExceptionResolver {
@Override
@Nullable
protected ModelAndView doResolveException(
HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex) {
try {
if (ex instanceof HttpRequestMethodNotSupportedException) {
return handleHttpRequestMethodNotSupported(
(HttpRequestMethodNotSupportedException) ex, request, response, handler);
}
.....
.....
else if (ex instanceof TypeMismatchException) {
return handleTypeMismatch(
(TypeMismatchException) ex, request, response, handler);
}
.....
.....
}
catch (Exception handlerEx) {
if (logger.isWarnEnabled()) {
logger.warn("Failure while trying to resolve exception [" + ex.getClass().getName() + "]", handlerEx);
}
}
return null;
}
protected ModelAndView handleTypeMismatch(TypeMismatchException ex,
HttpServletRequest request, HttpServletResponse response, @Nullable Object handler) throws IOException {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return new ModelAndView();
}
スプリング内部で発生した異常をHTTP specに適合する状態コードに変換して処理する.整理する
DefaultHandlerExceptionResolver:スプリング内部異常の処理
Reference
この問題について(API異常処理-DefaultHandlerExceptionResolver), 我々は、より多くの情報をここで見つけました https://velog.io/@hyun6ik/API-예외처리-DefaultHandlerExceptionResolverテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol