当前位置: 首页 > 知识库问答 >
问题:

Spring Boot拦截所有异常处理程序

王宏深
2023-03-14

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

在Spring Boot/Spring MVC中有这样做的方法吗?如果可能的话,我希望避免为此编写servlet过滤器。

共有3个答案

熊博远
2023-03-14

这不是一个真正的Spring Boot问题。这是一个真正的Spring MVC问题。一个好的方法是实现HandlerExceptionResolver,或者从ExceptionHandlerExceptionResolver扩展。实现需要被赋予比默认异常解析器更高的优先级(它们都以最低的优先级运行)。如果您希望保留默认解析器的现有行为,但仅为日志记录或跟踪等交叉事务捕获异常,那么只需为ModelAndView返回空值,Spring将确保像以前一样调用其他默认解析器。

沈长恨
2023-03-14

我有个解决办法。这是关于使用HandlerInterceptor的。完成后方法。然而,该方法的文档中有一行说明:

注意:仅当此拦截器的预处理方法已成功完成并返回true时才会调用!

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

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

@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位于顶部,它将拦截所有请求。

嵇昱
2023-03-14

有一种方法可以使用@RestControllerAdvice@ExceptionHandler,例如:

@RestControllerAdvice
public class GlobalControllerExceptionHandler {

    @ExceptionHandler(value = {DeniedPermissionException.class})
    @ResponseStatus(HttpStatus.FORBIDDEN)
    public String deniedPermissionException(DeniedPermissionException ex) {
        return "Denied permission";
    }

    @ExceptionHandler(value = {ConstraintViolationException.class})
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public String constraintViolationException(ConstraintViolationException ex) {
        return "Bad request";
    }

    @ExceptionHandler(value = {Exception.class})
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public String internalServerError(Exception ex) {
         return "Internal error";
    }
}

*DeniedPermissionException是一个自定义异常。

 类似资料:
  • 我有一个rest api: ..... 和serv.prop(请求): 在catch内部,我只想在这个api rest中截获错误类型(400404500502 ecc ecc),并调用记录此错误的外部服务。 谢谢你的帮助

  • 有没有一种方法可以在Spring Boot异常处理程序中一次捕获从web请求抛出的所有异常?我知道我可以在用注释的方法中捕获异常类型数组,但它不是我所说的类型。我需要一个异常对象列表之类的东西。我已经试过了 但Spring无法找到合适的解析器: 它只捕捉一个可抛物体,工作很好: 但是,如果在同一请求中有不同的参数冲突,如和,该怎么办? 如果不可能处理异常列表,如何满足RFC-7807(参见http

  • 我的项目是基于spring mvc的,我写了一个拦截器来拦截请求,我想从请求中获取参数,下面是我的代码: 但现在它抛出了一个异常: 出现例外的原因是什么?

  • 我的应用程序有许多RPC调用,它们都有一个.onFailure(可抛出捕获)方法。我有一个在客户端和服务器代码之间共享的类 不记录在例外中。如果用户没有基于会话/cookie/权限等的相关权限,则由服务器抛出。 理想情况下,我希望在将其他异常传递给.onFailure()代码之前,在一个地方处理此异常,因为此处理是如此普遍,而且出于安全考虑,需要如此。有一个GWT。setUncaughtExcep

  • 我有两个s-(A和B)并注册了。是否可以(以及如何做到)从调用并在应用异常处理程序后从获得响应? 例子: 用户Rest呼叫 使用调用 引发异常 由异常处理程序处理,转换并放置400状态 最终返回异常 从获取400状态 可以得到这个400并用它做点什么 简单的< code>@Autowired不起作用。 片段: 答: B: 处理程序

  • 本文向大家介绍Spring boot项目中异常拦截设计和处理详解,包括了Spring boot项目中异常拦截设计和处理详解的使用技巧和注意事项,需要的朋友参考一下 背景: 项目运行过程中会出现各种各样的问题,常见的有以下几种情况: 业务流程分析疏漏,对业务流程的反向操作、边界分析设计不充分 调用外部服务、调用外部系统出现的超时、错误、返回值与预期不符 外部资源连通性问题,db等服务器出现的网络抖动