
如果这接口是给第三方调用那是不行的,至此大致能了解到为啥需要对异常进行全局捕获了。
原理也很简单,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的方式。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)