Spring Boot-グローバル例外処理

3232 ワード

Spring Bootグローバル例外処理
0 x 01問題シーン
spring bootを使用して開発したとき、なぜWebアクセスがページに戻り、ajaxアクセスがjsonデータに戻り、異常をどのように処理するかが気になります.
なぜ@ExceptionHandlerを使用して404を処理できないのか
0 x 02先行知識
servletでエラーを処理する方法を理解する
Spring mvcとspring boot異常キャプチャは、リクエスト中に異常をキャプチャするだけであり、Controllerレイヤに入る異常のみをキャプチャし、他の異常はサーバに投げ込まれるため、tomcatのページがいくつか表示されることがありますが、spring bootでは、内蔵サービスタが実装されているため、異常を処理する方法を書き直しています.
Spring bootにはBasicErrorControllerがあり、ErrorMvcAutoConfigurationでエラーリダイレクト/errorが構成されています.このControllerはErrorControllerインタフェースを実現し、自動構成はこのインタフェースを実現したクラスが見つからない場合にのみ、BasicErrorControllerが自動的にロードされます.
結果を返すのはViewResolverで、content-typeに基づいて異なる実装クラスが返されるためです.
0 x 03解決の考え方
APIモジュールの使用を開発する場合、@ControllerAdvice@ExceptionHandlerを併用ことで基本的な問題を解決できるとともに、404などのエラーをキャプチャするためにアプリケーションが必要となる.ymlでの構成
spring:
    mvc:
        throw-exception-if-no-handler-found: true
    resources:
        add-mappings: false

この2つの構成は、取得要求が見つからないなどの例外を指定し、APIであるためリソースマッピングは必要ありません.
バックグラウンドモジュールを開発する場合、ajaxリクエストもページリクエストもあります.BasicErrorControllerを継承すればよい
@Controller
@RequestMapping({"${server.error.path:${error.path:/error}}"})
public class MyBasicExtendsController extends BasicErrorController {

    public MyBasicExtendsController(){
        super(new DefaultErrorAttributes(), new ErrorProperties());
    }

    @Override
    public ResponseEntity> error(HttpServletRequest request) {
        return new ResponseEntity(HttpStatus.BAD_REQUEST);
    }

    @Override
    public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
        return super.errorHtml(request, response);
    }
}

次に2つの方法を書き換えるだけでよく、カスタマイズが必要なパラメータも自分で注入することができます.そしてerror.を1つ実現すればhtmlのページでいいです.
0 xFF参考資料
https://www.cnblogs.com/xinzhao/p/4934247.html?utm_source=tuicool&utm_medium=referral
https://www.cnblogs.com/xinzhao/p/4902295.html?utm_source=tuicool&utm_medium=referral
https://segmentfault.com/a/1190000010060540
https://segmentfault.com/a/1190000006749441