1.はじめに
一貫性のある例外は自明のアプリケーションの重要性のために取り扱います。今日はご紹介春統一する方法をレスト例外処理を。同時に、我々は、単にそれらの間の長所と短所を比較します。
2. @Controller組み合わせ@ExceptionHandler
メソッド宣言した後で、コントローラ@ExceptionHandler
コメントタグであり得ます。
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping("/err")
@ResponseBody
public Object demo1(){
int i = 1 / 0;
return new Date();
}
@ExceptionHandler({RuntimeException.class})
public ModelAndView fix(Exception ex){
System.out.println(ex.getMessage());
return new ModelAndView("error",new ModelMap("ex",ex.getMessage()));
}
}复制代码
利点:
- 最高の優先度。
@ExceptionHandler
メソッドをマークすると、複数の戻り値の型をサポートしています。ビューであってもよいし、それはすることができますjson
ように。
短所:
- ノート上の例外の型はそうでない場合は、同じように表示される実行時例外をスローすることはできません。
Controller
@ExceptionHandler
- 明示的に例外処理の種類を宣言する必要があります。
- スコープはちょうどある
Controller
異常な本当の意味でのグローバルではありません。それはすべての親コントローラを置く世界的な必要性に基づいて行動する場合。
3. @ControllerAdvice組み合わせ@ExceptionHandler
これは、2定義することにより、改善された@ControllerAdvice
クラスのメソッドをマークし、@ExceptionHandler
グローバルな例外ハンドラの目的を達成するために:
@ControllerAdvice
public class TestController {
@ExceptionHandler({RuntimeException.class})
public ModelAndView fix(Exception ex){
System.out.println(ex.getMessage());
return new ModelAndView("error",new ModelMap("ex",ex.getMessage()));
}
}复制代码
利点:
- グローバル例外処理。
- フルボディ制御応答ステータスコード、および
- 異常の複数に対処する同じ方法にマッピングされ、それが更新さをフルに活用させる繧ResponseEntityの応答を
短所:
- ノート上の例外の型はそうでない場合は、同じように表示される実行時例外をスローすることはできません。
Controller
@ExceptionHandler
- 明示的に例外処理の種類を宣言する必要があります。
通常の状況下でも、このモードでは、例外処理を使用することをお勧めします。ほとんどの場合、それは互換性があります。
4. HandlerExceptionResolverインタフェース
実装HandlerExceptionResolver
のインターフェイスを、ここではその抽象的実現を継承していますAbstractHandlerExceptionResolver
:
@Component
public class RestResponseStatusExceptionResolver extends AbstractHandlerExceptionResolver {
@Override
protected ModelAndView doResolveException(
HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) {
try {
if (ex instanceof IllegalArgumentException) {
return handleIllegalArgument((IllegalArgumentException) ex, response, handler);
}
//todo more exception
} catch (Exception handlerException) {
//todo
}
return null;
}
private ModelAndView
handleIllegalArgument(IllegalArgumentException ex, HttpServletResponse response)
throws IOException {
response.sendError(HttpServletResponse.SC_CONFLICT);
String accept = request.getHeader(HttpHeaders.ACCEPT);
//todo more response
return new ModelAndView();
}
}复制代码
利点:
- これは、グローバルな例外ハンドラです。
- このようにグローバルな例外ハンドラが戻る
JSP
、velocity
など多くの便利なテンプレートビューなど。 - これは、メソッドのオーバーライドを返すものの、応答形式の様々なサポートしています
ModelAndView
が、パラメータがあるのでHttpServletResponse
、我々は、応答結果をカスタマイズするためにそれを使用することができます。クライアントが要求した場合のために、例えばapplication / json
、そのエラーが発生した場合、我々はに戻ることを確実にしたいapplication / json
コード化された応答。
短所:
- 私たちは下げる必要がある
HttpServletResponse
相互作用に対する応答体のさまざまな形態の実現を。 - 低順位
5.春ブート例外処理
あなたは、フレームワークを使用している場合である春はブート。我々はまた、独自のアプローチを使用することができます。利点は、APIの低レベルのシールドで、欠点も明らかである、特定の例外をキャプチャすることはできません。
5.1のErrorControllerを達成
春ブーツデフォルトでは、提供/error
中のすべてのエラー処理するためのマッピングサーブレットを(コンテナがグローバルエラーページを登録します。エラーホワイトレーベル)とクライアントに返します。実装によってのErrorControllerインターフェースおよび登録ビーン。例えば、もはやここに。あなたはを参照することができますBasicErrorController
。
5.2を追加 ErrorAttributes
また、追加することができますErrorAttributesのタイプのBeanのデフォルトの例外処理を置き換える交換します。
@Component
public class MyCustomErrorAttributes extends DefaultErrorAttributes {
@Override
public Map<String, Object> getErrorAttributes(
WebRequest webRequest, boolean includeStackTrace) {
Map<String, Object> errorAttributes =
super.getErrorAttributes(webRequest, includeStackTrace);
errorAttributes.put("locale", webRequest.getLocale()
.toString());
errorAttributes.remove("error");
//todo your business
return errorAttributes;
}
}复制代码
5.3継承基本クラスBasicErrorController
スプリングブート自動構成は、例えば実装提供のErrorControllerの取り扱いベースインタフェース例外BasicErrorController、処理デフォルトテキスト/ HTMLリクエストの間違った種類を、ベースクラスは、要求タイプを処理する複数のカスタム継承、及び共通追加するために使用する方法もよい@RequestMappingアノテーションを農産物プロセスを指定する属性タイプ。
@Component
public class MyErrorController extends BasicErrorController {
public MyErrorController(ErrorAttributes errorAttributes) {
super(errorAttributes, new ErrorProperties());
}
@RequestMapping(produces = MediaType.APPLICATION_XML_VALUE)
public ResponseEntity<Map<String, Object>> xmlError(HttpServletRequest request) {
//todo your business
}
}复制代码
6.春5的ResponseStatusException
また、最新で春5あなたはまた投げることができるResponseStatusException
例外を処理します。
利点:
- 使用する方が便利
- 、より多くのステータスコードを入力します。例外の種類が異なる様々な応答を引き起こす可能性があります。密結合を低減@ExceptionHandlerと比較すると、
- 我々は、多くのカスタム例外クラスとして作成する必要はありません。
- あなたがコントロール例外処理をより良くすることができるようにあなたは、プログラムで例外を作成することができますので、
短所:
- 特定のアプリケーション全体の合意を強制するために、さらに困難例外処理のない均一な方法はありません
- コードの重複がたくさんあるかもしれません。
7.まとめ
私たちは、一般的に珍しい使用春のメリットに分析し、まとめた例外を処理する方法を。私はあなたがあなたのために右である治療法を見つけることができると信じています。あなたは便利くださいヘルプのスポット、あなたの励まし、私のモチベーションを好きなら!
关注公众号:Felordcn获取更多资讯