Spring Boot异常处理
实际项目开发中,程序往往会发生各式各样的异常情况,特别是身为服务端开发人员的我们,总是不停的编写接口提供给前端调用,分工协作的情况下,避免不了异常的发生,如果直接将错误的信息直接暴露给用户,这样的体验可想而知,且对黑客而言,详细异常信息往往会提供非常大的帮助…
Spring Boot 默认异常处理机制
Spring Boot 提供了一套默认的异常处理机制,一旦程序中出现了异常,Spring Boot 会自动识别客户端的类型(浏览器客户端或机器客户端),并根据客户端的不同,以不同的形式展示异常信息。
- 对于浏览器客户端而言,Spring Boot 会响应一个“ whitelabel”错误视图,以 HTML 格式呈现错误信息,如图
springboot
中,默认在发送异常时,会跳转值/error
请求进行错误的展现,根据不同的Content-Type
展现不同的错误结果,如json请求时,直接返回json格式参数。
- 对于机器客户端而言,Spring Boot 将生成 JSON 响应,来展示异常消息。
Spring Boot 提供的默认异常处理机制却并不一定适合我们实际的业务场景,因此,我们通常会根据自身的需要对 Spring Boot 全局异常进行统一定制,例如定制错误页面,定制错误数据等。
Spring Boot全局统一异常处理
在web应用中,请求处理时,出现异常是非常常见的。所以当应用出现各类异常时,进行异常的捕获或者二次处理(比如sql异常正常是不能外抛)是非常必要的,比如在开发对外api服务时,约定了响应的参数格式,如respCode
、respMsg
,调用方根据错误码进行自己的业务逻辑。
创建全局的统一异常处理类
显然,默认的异常页是对用户或者调用者而言都是不友好的,所以一般上我们都会进行实现自己业务的异常提示信息。
利用
@ControllerAdvice
和@ExceptionHandler
定义一个统一异常处理类
- @ControllerAdvice:控制器增强,使@ExceptionHandler、@InitBinder、@ModelAttribute注解的方法应用到所有的
@RequestMapping注解的方法。 - @ExceptionHandler:异常处理器,此注解的作用是当出现其定义的异常时进行处理的方法
创建异常类:CommonExceptionHandler
@ControllerAdvice
public class CommonExceptionHandler {
/**
* 拦截Exception类的异常
* @param e
* @return
*/
@ExceptionHandler(Exception.class)
@ResponseBody
public Map<String,Object> exceptionHandler(Exception e){
Map<String,Object