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:スプリング内部異常の処理