異常なコントローラ層とリターンの統一された治療

異常なコントローラ層とリターン(1)の統一された治療の
異常な統一処理コントローラ層とリターン(2)
異常な統一処理コントローラ層と返す
まず、なぜそれを行いますか?
通常は、これまでの最初の反応は、のtry-catchキャッチ例外を使用して考えていた場合は、例外このプロセス投げる方法に気づいたときにコントローラ層界面を書面で分からないのですか?
コンパイルのチェックでのtry-catchを渡さないので、あなたが異常をキャプチャするためのイニシアチブを取ることができますが、この契約は、コンパイラの種類にのみ適しているので珍しい、自動的に検査し、処理を思い出させます。そこに、ランタイム例外であり、しかし、あなたはそれがどうなるかに対処するための時間だと思うする時間がありませんでしたか?これは、実行時の処理の例以下は珍しいことではありませんで、私たちは見ることができます:
@RestController
パブリッククラスExceptionRest {
@GetMapping(「getNullPointerException」)
公共の地図<文字列、オブジェクト> getNullPointerException(){
スロー新しい新しいNullPointerExceptionが(「NULLポインタがありました例外「);
}
}

打ち上げ後にTomcatを使用してMavenのSpringMVCプロジェクトに基づいて上記のコードでは、ブラウザは、以下の要求を開始します:
HTTP:// localhostを:8080 / zxtest / getNullPointerException
結果訪問の後はこれです:

ブラウザはエラーメッセージを受信しました

あなたは私たちがnullポインタ例外をスローし、フロントエンドのブラウザに戻ります例外スタックをその結果、ユーザーは非常に悪い経験を作成し、コントローラのインタフェース層にとらわれない、見ることができます。
また、エラーメッセージのフロントエンドは、サーバから見ることができ、ミドルウェアの種類、フレーム情報と使用される情報の種類を使用してバックエンドシステムは、バックエンドのSQL例外がスローされた場合でも、あなたはまた、SQL例外を見ることができます中等度リスクのセキュリティ上の脆弱性であるパラメータ情報特定の照会には、修復する必要があります。
PS:SpringBoot自動エラーが取引を行うためのコンテンツを返したため、上記の項目であれば、その後、SpringBootが前面に情報を与えられないかもしれません使用し、我々はより複雑なシナリオは、現在のMavenのWebテンプレートを使用するだけSpringMVCを含むプロジェクトを作成する必要があります。
第二に、どのように統一された治療を行いますか?
時間を実行しているときに異常これが発生すると、以下のように、我々はおそらく考える最も簡単な方法は、例外処理とコードに例外をスローすることがあります。
@RestController
パブリッククラスExceptionRest {
プライベートロガーログ= LoggerFactory.getLogger( ExceptionRest.class);
@GetMapping( "getNullPointerException")
公共の地図<文字列、オブジェクト> getNullPointerException(){
地図<文字列、オブジェクト> =新しい新しいreturnMapは、HashMapの<文字列、オブジェクト>()で、
試してみる{
(スローNullPointerExceptionが新しい新しい「が表示されますnullポインタ例外「);
キャッチ}(のNullPointerException E){
log.error( "nullポインタ例外が発生しました"、E);
returnMap.put(falseに"成功"、);
。returnMap.put( "MESG"、」例外要求は、もう一度試してくださいテスト「);
}
戻りreturnMapであり;
}
}

我々は、手動スロープラス取り扱いと適切なリターンが異常なコンテンツの前にリターンを発生し、それゆえ、それは我々が再びブラウザで同じ要求を起動すると、以下を得るためにされた場所ので:
{
成功:偽、
MESG:「異常な要求、後でもう一度試してください」
}

問題が解決されたように見えますが、あなたはあなただけのすべての場所の例外中の例外が発生し、それに対処することが捕獲されていることができることを確認することができますか?あなたは他の人のチームがそうすることを確認することができますか?
もちろん、あなたが治療プログラムでキャッチ統一例外を必要とします。
2.1 HandlerExceptionResolverを使用
HandlerExceptionResolverは、例外ハンドラ・インタフェースで、すべての設定の例外をキャプチャすることができます、我々は統一されたWebベースの例外処理を達成し、春のコンフィギュレーションファイルに登録その種の後にコントローラ層を投げ、結果を返すためにここにいます。
2.1.1基本的な使用

方法1:HttpServletResponseのリターンJSON情報を使用します

@Controller
パブリッククラスWebExceptionResolverはHandlerExceptionResolver {実装
プライベートロガーログ= LoggerFactory.getLogger(WebExceptionResolver.class)を、
@Override
公共のModelAndView resolveException(HttpServletRequestのHttpServletRequestを、HttpServletResponseのHttpServletResponseの、物体O、例外e){
log.error(「请求{}发生异常!」、httpServletRequest.getRequestURI())。
ModelAndViewのMV =新しいのModelAndView();
httpServletResponse.setContentType(「アプリケーション/ JSON;のcharset = UTF-8」);
httpServletResponse.setCharacterEncoding(「UTF-8」);
ストリングretStr =「{ 『成功』:偽、 『MSG』: 『请求异常、请稍后再试』}」。
{みてください
。httpServletResponse.getWriter()(retStr)を書き込みます。
}キャッチ(例外例){
log.error(「WebExceptionResolver例外処理」、EX);
}
//異常のModelAndView他のプロセッサは捕獲され続け防ぐために、空の戻る必要
戻りミュージックビデオを、
}
}

以上の処理により、すべての例外が、その後resolveExceptionに捕獲され、処理WebExceptionResolver Web層することができ、情報を返すと戻りたいのHttpServletResponseを統一するために使用されます。以下は、ブラウザのコンテンツに同じリンクを返すように要求です。

メッセージは、傍受のWeb異常を返さ

第二の方法:のModelAndViewリターンJSON情報を使用して

@Controller
パブリッククラスWebExceptionResolverはHandlerExceptionResolver {実装
プライベートロガーログ= LoggerFactory.getLogger(WebExceptionResolver.class)を、
@Override
公共のModelAndView resolveException(HttpServletRequestのHttpServletRequestを、HttpServletResponseのHttpServletResponseの、物体O、例外e){
log.error(「请求{}发生异常!」、httpServletRequest.getRequestURI())。
ModelAndViewのMV =新しいのModelAndView(新MappingJackson2JsonView());
mv.addObject(「成功」、「偽」);
mv.addObject(「MESG」、「请求异常、请稍后再试」);
MVを返します。
}
}

これら二つの効果同じように、唯一の違いは、第二の実施形態は、複数の導入ジャクソンデータバインドパッケージの使用を必要とすることです。

com.fasterxml.jackson.core
ジャクソンのDataBind

2.1.2特定の例外処理
時には私たちは、あなただけ個別に取り込むことができ例外処理の種類を決定する必要があり、具体的な異常が発生した場合に、いくつかの処理を実行する必要があります。
@Controller
パブリッククラスをWebExceptionResolver実装HandlerExceptionResolver {
プライベートロガーログ= LoggerFactory.getLogger (WebExceptionResolver.class);
@Override
公共のModelAndView resolveException(HttpServletRequestのHttpServletRequestを、HttpServletResponseのHttpServletResponseの、オブジェクトO、例外E){
log.error( "{}例外要求が発生!"、HttpServletRequest.getRequestURI());
のModelAndView =ミュージックビデオの新しい新しいのModelAndView (新新MappingJackson2JsonView());
mv.addObject( "成功"、 "偽の");
IF(NullPointerExceptionがinstanceofはE){
mv.addObject( "MESGは"、 "nullポインタ例外要求が発生し、後でもう一度試してください") ;
}そうでなければ(ClassCastExceptionがinstanceofのE){IF
mv.addObject(「MESG」、「型変換例外要求が発生し、しばらくしてからもう一度試してください」);
}他{
mv.addObject(「MESG」は、「例外要求が発生し、しばらくしてからもう一度試してください」);
}
戻りミュージックビデオ;
}
}

2.1.3例外処理チェーン
HandlerExceptionResolver例外クラス複数の実装が存在する場合、それらはステートメントフロントプロファイルに複数のばね、処理後に、このケースを宣言する処理チェーン、前処理を形成します最初の処理クラスは、より多くの例外処理である、あるいはその後のプロセッサを処理していない、例外を遮断することができます。
PS:あなたはさらに、別のプロセッサによって投げ出されないようにするには、現在の例外ハンドラで例外をインターセプトする予定がある場合は、直接、最後のリターンで、空のModelAndViewオブジェクトをすることができます。あなたは、この例外をインターセプトする予定がない場合は、それがnullを返すことができ、他のプロセッサをできるように続けます。
//他のプロセッサが捕獲され続けて異常のModelAndViewを防止するために、空返す必要が
リターンMVを;
//戻りますが、例外処理するために続けることができ、異常、他のプロセッサをインターセプトしませんがnull
nullを返します。

2.2 @ExceptionHandler
Spring3.2後、SpringMVCは、あなたがする必要がある唯一のものは、完了するために、新しいコントローラを作成し、2つのノートとの内側にある、例外がより簡単に、より正確なハンドリングのために作る、exceptionHandlerのアプローチを導入しましたすべての例外を捕捉し、プロセスコントローラ層。
2.2.1基本的な使用の
新しいコントローラは、次のとおりです。
@ControllerAdvice
パブリッククラスExceptionConfigController {
@ExceptionHandler
exceptionHandlerの(例外E){から公開のModelAndView
のModelAndViewミュージックビデオの新しい新しいのModelAndView =(新新MappingJackson2JsonView());
mv.addObject(falseに"成功"、);
ミュージックビデオを.addObject(「MESG」、「例外要求が発生し、後でもう一度試してください」);
ミュージックビデオを返します;
}
}

我々は、これは例外であることを示し、それは次に@ExceptionHandlerメモを追加exceptionHandlerの方法を、オブジェクトのModelAndViewリターンを作成し、コントローラの拡張バージョンであることを示す、@ControllerAdviceクラスノートコード上にある、プラス処理方法は、その後、特定の例外処理ロジックとリターンパラメータがそう本当にあまりにも便利な、すべての作業を完了するために、できる方法を記述します。
私たちは、呼び出しに次のような結果を開始した後、ブラウザに戻る:
{
成功:偽、
MESG:「要求の例外が発生し、後でもう一度やり直してください」
}

取り扱い2.2特定の例外
比べ種々の異常のより柔軟な処理を@ExceptionHandler用いて、それぞれに対してHandlerExceptionResolver有します。指定された例外が例外サブクラスをスローされたときに、それはまだ捕獲して処理することができます。
我々は、コントローラ層でコードを変更すると、次の
@RestController
パブリッククラスExceptionController {

@GetMapping("getNullPointerException")
public Map<String, Object> getNullPointerException() {
    throw new NullPointerException("出现了空指针异常");
}

@GetMapping("getClassCastException")
public Map<String, Object> getClassCastException() {
    throw new ClassCastException("出现了类型转换异常");
}

@GetMapping("getIOException")
public Map<String, Object> getIOException() throws IOException {
    throw new IOException("出现了IO异常");
}

}

ClassCastExceptionがNullPointerExceptionが知られているとのRuntimeExceptionを継承した、とのRuntimeExceptionとIOExceptionが例外を継承します。
:私たちはExceptionConfigController過程でこれを行う
@ControllerAdvice
パブリッククラスExceptionConfigController {
//キャプチャするために設計されており、プロセスNullPointerExceptionがコントローラ層
@ExceptionHandler(NullPointerException.class)
公共のModelAndView nullPointerExceptionHandler(NullPointerExceptionがE){
のModelAndViewミュージックビデオの新しい新しいのModelAndView =(新新MappingJackson2JsonView());
mv.addObject falseに( "成功"、);
mv.addObject( "MESG"、 "nullポインタ例外要求が発生し、後でもう一度試してください");
戻りミュージックビデオ;
}

// 专门用来捕获和处理Controller层的运行时异常
@ExceptionHandler(RuntimeException.class)
public ModelAndView runtimeExceptionHandler(RuntimeException e){
    ModelAndView mv = new ModelAndView(new MappingJackson2JsonView());
    mv.addObject("success",false);
    mv.addObject("mesg","请求发生了运行时异常,请稍后再试");
    return mv;
}

// 专门用来捕获和处理Controller层的异常
@ExceptionHandler(Exception.class)
public ModelAndView exceptionHandler(Exception e){
    ModelAndView mv = new ModelAndView(new MappingJackson2JsonView());
    mv.addObject("success",false);
    mv.addObject("mesg","请求发生了异常,请稍后再试");
    return mv;
}

}

それから

私たちはコントローラー層にNullPointerExceptionが投げたとき、それはその後、傍受nullPointerExceptionHandlerを、処理されます。
{
成功:偽に
MESG:「nullポインタ例外要求が発生し、後でもう一度試してください」
}

私たちはコントローラー層にClassCastExceptionがスローすると、それはその後、傍受runtimeExceptionHandlerを、処理されます。
{
成功:偽への
MESGは:「例外要求が発生し、実行している後でもう一度試してください」
}

私たちは、コントローラ層IOExceptionをスローする場合は、傍受exceptionHandlerのを、処理されます。
{
成功:falseに、
MESG:「例外要求が発生し、後でもう一度試してください」
}

第三に、要約
コントローラ層SpringMVCは、例外処理を提供してくれ、本当に特に@ExceptionHandlerあまりにも便利ですが、我々は使用をお勧めします。

著者:力羊の
リンク:https://www.jianshu.com/p/d3fd250db622
出典:ジェーン・ブック
著者によって予約ジェーン帳の著作権は、いかなる形で再現され、承認を得るために、作者に連絡して、ソースを明記してください。

おすすめ

転載: blog.csdn.net/wcc178399/article/details/91143165