Springboot全局异常处理

Springboot全局异常处理,第1张

从 spring 3.2 开始,新增了 @ControllerAdvice 注解,可以用于定义@ExceptionHandler,并应用到配置了@RequestMapping 的控制器中。

如果这接口是给第三方调用那是不行的,至此大致能了解到为啥需要对异常进行全局捕获了。

原理也很简单,Spring Boot 默认提供了程序出错的结果映射路径/error。这个/error请求会在BasicErrorController中处理,其内部是通过判断请求头中的Accept的内容是否为text/html来区分请求是来自客户端浏览器(浏览器通常默认自动发送请求头内容Accept:text/html)还是客户端接口的调用,以此来决定返回页面视图还是 JSON 消息内容。

浏览器端访问的话,任何错误Spring Boot返回的都是一个Whitelabel Error Page的错误页面,这个很不友好,所以我们可以自定义下错误页面。

这样运行的时候,请求一个不存在的页面或服务端处理发生异常时,展示的自定义错误界面。

Spring Boot提供的ErrorController是一种全局性的容错机制。此外,你还可以用@ControllerAdvice注解和@ExceptionHandler注解实现对指定异常的特殊处理。

这里介绍两种情况:

局部异常主要用到的是@ExceptionHandler注解,此注解注解到类的方法上,当此注解里定义的异常抛出时,此方法会被执行。如果@ExceptionHandler所在的类是@Controller,则此方法只作用在此类。如果@ExceptionHandler所在的类带有@ControllerAdvice注解,则此方法会作用在全局。

在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。

简单的说,进入Controller层的错误才会由@ControllerAdvice处理,拦截器抛出的错误以及访问错误地址的情况@ControllerAdvice处理不了,由SpringBoot默认的异常处理机制处理。

我们实际开发中,如果是要实现RESTful API,那么默认的JSON错误信息就不是我们想要的,这时候就需要统一一下JSON格式,所以需要封装一下。

此类在common的项目,要暴露出去给依赖的项目使用,在文件src\main\resources\META-INF\spring.factories中添加最后一行

可以被全局异常捕捉并处理成json

访问接口,如果无数据,则输出异常信息

{"data":"package id为:BZ-20200107000005 的indexpackage无记录","flag":false,"code":null,"msg":"未查到数据"}

全局异常类可以用 @RestControllerAdvice ,替代 @ControllerAdvice ,因为这里返回的主要是json格式,这样可以少写一个 @ResponseBody 。

记录日志后再抛出异常

protected <T> int executeUpdate(String sql, Object[] params, Class<T> clazz) {

Logger log = Logger.getLogger(clazz)

int result = 0;

try {

result = jdbc.update(sql, params) 

} catch (DataAccessException e) {

log.error(clazz + e.getMessage(), e)

throw e

}

return result;

}

把DAO的异常最后仍交由Spring-tx处理,这样跟是否catch过就没差了。

另外我还改了一下return的方式。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9862626.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存