Spring Boot 拦截所有异常处理程序 [英] Spring Boot intercept all exception handlers

查看:64
本文介绍了Spring Boot 拦截所有异常处理程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试执行一些适用于代码中所有 @ExceptionHandler 的通用逻辑.我知道我可以编写一个 HandlerInterceptor 来拦截快乐路径.但我想挂钩异常处理生命周期,以便在呈现错误响应之前执行一些常见逻辑,例如日志记录.

I am trying to perform some common logic that applies to all my @ExceptionHandlers in code. I know I can write a HandlerInterceptor to intercept happy paths. But I would like to hook into the exception handling lifecycle so that I can execute some common logic such as logging, before the error response is rendered.

无论如何要在 Spring Boot/Spring MVC 中执行此操作吗?如果可能,我想避免为此目的编写 servlet 过滤器.

Is there anyway to do this in Spring Boot / Spring MVC? I would like to avoid having to write a servlet filter for this purpose if possible.

推荐答案

我有一个解决方案.这是关于使用 HandlerInterceptor.afterCompletion 方法.但是,在 此方法的文档 指出:

I have a solution. It's about using HandlerInterceptor.afterCompletion method. However, there is a line in the documentation of this method that states that:

注意:只有当这个拦截器的preHandle方法成功完成并返回true时才会被调用!

Note: Will only be called if this interceptor's preHandle method has successfully completed and returned true!

所以诀窍是同时实现 preHandle 并使其返回 true.

So the trick is to also implement the preHandle and make it return true.

现在我的拦截器看起来像这样:

Now my interceptor looks like this:

@Component
public class MyInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // perform common logic here
    }
}

但是要注意的一件事是,如果您有一个拦截器链和一个拦截器,然后在这个拦截器抛出异常之前,这个拦截器将没有机会执行.因此,如果我们重新排序拦截器链,使 MyInterceptor 位于顶部,它将拦截所有请求.

One thing to be aware of though is that if you have a chain of interceptors and an interceptor before this one throws an exception, this interceptor won't get a chance to execute. So if we reorder the interceptor chain so that MyInterceptor is right at the top, it will intercept all requests.

这篇关于Spring Boot 拦截所有异常处理程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆