SpringBoot 入门:10 – 统一异常处理

开发过程中,我们经常会遇到程序报错的情况,对调用方来说,这种情况下他们能看到的就是一大段错误或者是描述模糊的提示。我们希望对可预期的异常进行全局捕获,并进行适当处理,然后以清晰的说明返回给调用方。

Spring Boot 中我们可以使用 @ControllerAdvice 注解然后配合 @ExceptionHandler 对不同类型的异常进行统一的捕获并输出:

@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
public ApiResponse<Object> constraintViolationException(ConstraintViolationException e) {
    return ApiResponse.fail(400, e.getConstraintViolations().iterator().next().getMessage());
}

@ExceptionHandler
@ResponseBody
public ApiResponse<Object> unknownException(Exception e) {
    log.error("[CUSTOM]Handling error: " + e.getClass().getSimpleName() + ", " + e.getMessage());
    return ApiResponse.fail(ApiCode.API_ERR);
}
复制代码

第二个方法是通用异常捕获输出,上面的异常处理方法没有捕获到的异常都有一个兜底的处理方法。第一个方法是对参数校验失败的异常进行捕获并获取第一个校验失败的参数的失败说明进行输出。

上面的捕获方式只能对程序进入到 Controller 层之后报出的异常进行捕获,比如如果是认证失败、未授权等这类前置过滤器、拦截器中报出的异常则无法进行捕获,所以我们还需要在 WebSecurityConfig 中的 configure(HttpSecurity http) 方法进行异常处理:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.exceptionHandling()
        .authenticationEntryPoint((httpServletRequest, httpServletResponse, e) -> ApiResponse.fail(httpServletResponse, ApiCode.API_UNAUTHORIZED.getMsg()))
        .accessDeniedHandler((httpServletRequest, httpServletResponse, e) -> ApiResponse.fail(httpServletResponse, ApiCode.API_ACCESS_DENIED.getMsg()));

    http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
}
复制代码

暂时就这么多,多实践,多分享~

原文 

https://juejin.im/post/5f16b803f265da22b05b05dc

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » SpringBoot 入门:10 – 统一异常处理

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址