前のセクションでは、Spring Bootがスケジュールされたタスクを統合する方法と、Spring Bootが非同期タスクとスケジュールされたタスクを作成する方法について説明しました。あいまいな友達は以前の記事「Spring Boot Getting Started Series」を見てください。
次に、Spring Bootアプリケーションで統一例外処理を使用する方法を主に説明します。
例外処理を統合する理由
プロジェクトの開発形式はフロントエンドとバックエンドの分離であり、Restfulインターフェースの形式で開発され、例外処理とページビジネスデータはjson形式で返されます。ただし、データベースの例外、Shiroの例外、Redisの例外などの例外がバックグラウンドで発生した場合、フロントエンドは通常、ユーザーにとって非常に不快な非常に醜いエラーページを表示するため、さまざまなシステム例外を統一された方法で処理する必要がありますそして、必要な結果を返します。
達成する方法
Spring Bootが統合された例外処理を実装するには、主に2つの方法があります。
最初のもの:@ControllerAdviceと@ExceptionHandlerアノテーションを使用する
2番目:達成するためにErrorControllerクラスを使用します。
ErrorControllerの使い方は比較的簡単なので、ここでは紹介しません。今日は主に、@ ControllerAdviceおよび@ExceptionHandlerアノテーションを使用して統合例外処理を実装する方法について説明します。
1.統一された例外処理
パッケージcom.weiz.exception; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.ModelAndView; import com.weiz.utils.JSONResult; @ControllerAdvice public class GlobalExceptionHandler { public static final String ERROR_VIEW = "error" ; @ExceptionHandler(値 =例外。クラス) 公衆オブジェクトerrorHandler(HttpServletRequest reqest、 HttpServletResponse response、Exception e)が例外{ e.printStackTrace();を スローします。// 是否ajax请求 if (isAjax(reqest)){ return JSONResult.errorException(e.getMessage()); } else { ModelAndView mav = new ModelAndView(); mav.addObject( "exception" 、e); mav.addObject( "url" 、reqest.getRequestURL()); mav.setViewName(ERROR_VIEW); mavを返します。 } } public static boolean isAjax(HttpServletRequest httpRequest){ return (httpRequest.getHeader( "X-Requested-With")!= null && "XMLHttpRequest" .equals(httpRequest.getHeader( "X-Requested-With" ))); } }
説明:
1. @ControllerAdviceアノテーションは、これがコントローラー拡張クラスであることを示し、コントローラーで例外が発生すると、このインターセプターによってインターセプトされます。
2.アノテーション@ExceptionHandlerは、スローされた例外情報を取得できるインターセプトされた例外クラスを定義します。ここでは、さまざまな例外クラスをインターセプトする複数のインターセプトメソッドを定義でき、スローされた例外の情報をより自由に取得できます。
2.エラーページ
<!DOCTYPE html> <html> <head lang = "en"> <meta charset = "UTF-8" /> <title>捕获全局异常</ title> </ head> <body> <h1 style = "color :red ">発生错误:</ h1> <div th:text =" $ {url} "> </ div> <div th:text =" $ {exception.message} "> </ div> </ body > </ html>
説明:ここthymeleafテンプレートがあり、この導入前:「SpringBoot入門シリーズ(4)統合テンプレートエンジンThymeleaf」
3.テストクラス
異常にテストするコントローラーを作成する
パッケージcom.weiz.controller; import com.weiz.utils.JSONResult; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping( "err" ) public class ErrorController { @RequestMapping( "/ error" ) public String error(){ int a = 1/0 ; "thymeleaf / error"を返します。 } @RequestMapping( "/ ajaxerror" ) public String ajaxerror(){ return "thymeleaf / ajaxerror" ; } @RequestMapping( "/ getAjaxerror" ) @ResponseBody public JSONResult getAjaxerror(){ int a = 1/0 ; JSONResult.ok();を返します。 } }
テスト中
ブラウザに入力:http:// localhost:8088 / err / error
最後
これで、Spring Boot統合例外処理が終了しました。ここでは、@ ControllerAdviceアノテーションを使用して例外処理を実装する方法と、ErrorControllerの実装のみを紹介しているので、理解できます。
@ControllerAdviceメソッドは、コントローラーによってスローされた例外のみを処理できますが、ErrorControllerのようなメソッドは、404、401などのコントローラーに入っていないエラーやその他のエラーを含むすべての例外を処理できます。