チュートリアルの春BOOT2シリーズ(XIII)グローバル春ブーツ例外処理

春ブーツプロジェクトでは、異常な集中、あなたがプロセスを統一する@ControllerAdviceで春を使用することができ、また、あなた自身の例外処理スキームを定義することができます。春ブーツは、例外処理のためのいくつかのデフォルトの戦略があり、我々は実行されました。

デフォルトでは、春ブーツは、このようなページの異常:

この例外から私たちをプロンプト、あなたがそれを見ることができ、開発者は/エラーパスを提供しています場合、開発者は、明確な/エラーパスが提供されていないため、ユーザーは、このページを参照してください理由は、このページは表示されませんが、 /エラーパスが実際に最後の手段が提供される春ブーツで、春ブーツ自体が例外を扱うには、すべての条件が満たされない場合は、/エラーパスを行くです。その後、我々は春ブーツを見て、エラーページをカスタマイズする方法を、全体的に、それは二つのタイプに分けることができ、一つは静的なページ、および動的なページです。

静的例外ページ

カスタム異常静的ページは、最初は、404.html、405.html、500.htmlとして、ページに名前を付けるためにHTTPレスポンスコードを使用することで、2分割され...、別の直接4XXを定義することです。 HTML、400-499は例外ページの状態を表しているが表示され、5xx.html表示は、例外ページ500-599の状態を示します。

デフォルトはclasspath:/static/error/、パスの関連ページの定義:

この場合は、プロジェクトの要求は500エラーをスローした場合、このページは自動的に404.htmlは、404ページの発生が表示されます、500.htmlが表示されます、プロジェクトを開始します。異常な表示ページが両方5xx.htmlが存在する場合は、この時間、500例外が発生し、優先ショー500.htmlページが500.html。

ダイナミック例外ページ

例外ページの定義の動的および静的な方法基本的に同じである、ページテンプレートを使用することができ、JSP thymeleaf FreeMarkerのです。ダイナミック例外ページには、また、テンプレートthymeleafここで使用される(404.htmlまたは4xx.htmlをサポートしていますが、一般的には、異常な動的ページへの例外の詳細は、直接表示することができますので、1つのミスによるものを列挙する必要はありません、直接4xx.html定義されました)または5xx.htmlができます。

動的ページのテンプレートは、独自のコントローラを定義するために、開発者を必要としないことに注意してください、直接定義の例外ページができ、春ブーツは、例外ハンドラが付属して自動的に例外ページがあります。

次のようにページが定義されています。

次のようにページを読み取ります。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>5xx</h1>
<table border="1">
    <tr>
        <td>path</td>
        <td th:text="${path}"></td>
    </tr>
    <tr>
        <td>error</td>
        <td th:text="${error}"></td>
    </tr>
    <tr>
        <td>message</td>
        <td th:text="${message}"></td>
    </tr>
    <tr>
        <td>timestamp</td>
        <td th:text="${timestamp}"></td>
    </tr>
    <tr>
        <td>status</td>
        <td th:text="${status}"></td>
    </tr>
</table>
</body>
</html>

デフォルトでは、完全な例外メッセージは、次のような効果がある示し、この5です。

動的ページと静的ページは、また、例えば、例外処理のページを定義した場合classpath:/static/error/404.html、およびclasspath:/templates/error/404.htmlそこに同時に、デフォルトでは、動的なページを使用しています。それは次のようになります。完全なエラーページを見つけるための方法です。

500エラーが発生しました - ダイナミック5xx.htmlを探す> - - 静的500.htmlを探す> - >ダイナミック500.htmlページを探す>静的5xx.htmlを探します。

カスタム異常データ

デフォルトでは、上記のすべての春ブーツは、5つのデータ定義した表示データ5のうち、実際に異常なデータであるorg.springframework.boot.web.reactive.error.DefaultErrorAttributesクラスは、特に定義されたgetErrorAttributes方法:

@Override
public Map<String, Object> getErrorAttributes(ServerRequest request,
                boolean includeStackTrace) {
        Map<String, Object> errorAttributes = new LinkedHashMap<>();
        errorAttributes.put("timestamp", new Date());
        errorAttributes.put("path", request.path());
        Throwable error = getError(request);
        HttpStatus errorStatus = determineHttpStatus(error);
        errorAttributes.put("status", errorStatus.value());
        errorAttributes.put("error", errorStatus.getReasonPhrase());
        errorAttributes.put("message", determineMessage(error));
        handleException(errorAttributes, determineException(error), includeStackTrace);
        return errorAttributes;
}

DefaultErrorAttributesクラス自体は、開発者がErrorAttributesの独自のインスタンスを提供しない場合、その後、春の起動を自動的にErrorAttributesを提供し、org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration異常自動設定クラスで定義され例は、DefaultErrorAttributesです。

これに基づき、開発者は、2つの方法でErrorAttributesをカスタマイズ:

  1. ErrorAttributesを達成するためのダイレクトインターフェース
  2. 継承DefaultErrorAttributes(推奨)、DefaultErrorAttributesが異常なデータの処理は完了しているので、開発者が直接使用することができます。

次のように定義されました:

@Component
public class MyErrorAttributes  extends DefaultErrorAttributes {
    @Override
    public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
        Map<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace);
        if ((Integer)map.get("status") == 500) {
            map.put("message", "服务器内部错误!");
        }
        return map;
    }
}

豆は、そう、春ブーツがデフォルトDefaultErrorAttributes、および営業成績を使用しないので、以下のように定義されるErrorAttributesを登録する必要があります。

カスタム例外ビュー

デフォルトのビューは、前述の異常な静的または動的なページであり、これもカスタマイズすることができる、最初、デフォルトのビュー異常ローディング論理errorHtml方法org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorControllerクラスこの方法は、データ+例外ページを返すために使用され、(AJAX要求、方法がトリガされる場合)データに例外を返し、別のエラー方法があります。

@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
public ModelAndView errorHtml(HttpServletRequest request,
                HttpServletResponse response) {
        HttpStatus status = getStatus(request);
        Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(
                        request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));
        response.setStatus(status.value());
        ModelAndView modelAndView = resolveErrorView(request, response, status, model);
        return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);
}

この方法では、最初は(実際にgetErrorAttributesインスタンスErrorAttributes年代にメソッドを呼び出します)getErrorAttributesの外れ値で取得するために行くだろうし、この作成が失敗した場合、のModelAndViewを作成するためにresolveErrorViewを呼び出して、ユーザーがデフォルトのエラーが表示されますヒントページ。

通常の状況下では、resolveErrorView方法はresolveErrorViewメソッドDefaultErrorViewResolverクラスを来ります。

@Override
public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status,
                Map<String, Object> model) {
        ModelAndView modelAndView = resolve(String.valueOf(status.value()), model);
        if (modelAndView == null && SERIES_VIEWS.containsKey(status.series())) {
                modelAndView = resolve(SERIES_VIEWS.get(status.series()), model);
        }
        return modelAndView;
}

ここでは、ビューとしての第1の異常応答コード名は、ビューは、動的または静的なページを探しに行くためにあったように4xxまたは5xxの名前で再度、見つからない場合は、動的ページと静的なページを見つけることでした。

DefaultErrorViewResolverは、開発者がインスタンスを提供しないErrorMvcAutoConfigurationクラスで提供されている例は、デフォルトDefaultErrorViewResolverを使用しますが、開発者が独自のErrorViewResolver例を提供し、デフォルトの設定であるため、カスタム例外ビューの解像度にした後、それは、また非常に簡単です。それゆえ、カスタム例外ビューは、ちょうどErrorViewResolverの例を提供するために、失敗します。

@Component
public class MyErrorViewResolver extends DefaultErrorViewResolver {
    public MyErrorViewResolver(ApplicationContext applicationContext, ResourceProperties resourceProperties) {
        super(applicationContext, resourceProperties);
    }
    @Override
    public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {
        return new ModelAndView("/aaa/123", model);
    }
}

実際には、開発者が定義することができる場合、異常データ、(再定義resolveErrorView法で直接モデル、モデルデータをコピーして、モデルの種類に注意がUnmodifiableMapパラメータ、直接変更しない、すなわち過去のパラメータを変更する)と何のカスタムMyErrorAttributesません。定義されると、以下に示すように、図123は、名前を提供します。

そうした後、エラーが成功を定義しようとした場合でも。

概要

実際には、それはまた、カスタム例外コントローラBasicErrorControllerすることができますが、歌Geが、これはあまりにも戦争に行くと思う、といくつかの方法の前にある必要は、我々のニーズのほとんどを満たすために開発されていません。スプリッタアーキテクチャ、例外処理の前後端は、他の治療法の選択肢がある場合は、ソングGeおよび後には、私たちは話しています。

ジャワ、JavaのドライソングGeはあなたのために慎重に準備された受信した後、国民の関心番号[南]少し雨が、懸念は返信共有するために、定期的に春ブーツ+マイクロサービスとフロントと分離フルスタック技術、ビデオチュートリアルの後端に焦点を当てました!

おすすめ

転載: www.cnblogs.com/lenve/p/11702806.html