SpringBoot 统一异常处理

1、自定义异常

/** * 自定义请求限制异常 * @author PkyShare * @date 2020/3/20 0020 18:02 */ public class RequestLimitException extends Exception { private static final long serialVersionUID = 1324220058954874702L; public RequestLimitException() { super("请求超出设定的限制"); }public RequestLimitException(String message) { super(message); } }

2、全局异常捕获
package com.huanda.app.server.admin.controller.config; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletResponse; import com.alibaba.fastjson.JSONObject; import com.huanda.app.server.commons.constant.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; /** * 全局异常捕捉 * @author PkyShare * @date 2020/8/13 0013 10:38 */ @ControllerAdvice public class GlobaExceptionHandler {/** * 自定义访问频繁异常处理 * @return */ @ExceptionHandler(RequestLimitException.class) public ResponseEntity globaException(){ Map map = setResultMap(HttpStatus.FREQUENT_VISITS.getCode(), HttpStatus.FREQUENT_VISITS.getTitle()); return new ResponseEntity(map, org.springframework.http.HttpStatus.OK); }/** * 全局异常处理,统一处理所有类型的异常 * @return */ @ExceptionHandler(Exception.class) public ResponseEntity globaException(){ Map map = setResultMap(HttpStatus.NETWORK_AUTHENTICATION_REQUIRED.getCode(), HttpStatus.NETWORK_AUTHENTICATION_REQUIRED.getTitle()); return new ResponseEntity(map, org.springframework.http.HttpStatus.OK); }/** * 设置返回状态码和信息 * @param code 状态码 * @param title 信息 * @return */ private Map setResultMap(Integer code, String title) { Map map = new HashMap<>(); map.put("code", code); map.put("title", title); return map; }//@ExceptionHandler(RequestLimitException.class) //public void globaException(HttpServletResponse response) throws Exception { //setResultJson(response, HttpStatus.FREQUENT_VISITS.getCode(), HttpStatus.FREQUENT_VISITS.getTitle()); //} // ///** //* 设置响应json数据 //* @param response //* @param code 状态码 //* @param title 返回说明 //* @return //*/ //private void setResultJson(HttpServletResponse response, Integer code, String title) throws Exception{ //response.setCharacterEncoding("UTF-8"); //response.setContentType("application/json; charset=utf-8"); //PrintWriter writer = response.getWriter(); //JSONObject resultJson = new JSONObject(); //resultJson.put("code", code); //resultJson.put("title", title); //writer.append(resultJson.toJSONString()); //} }

在 Spring 里,我们可以使用 @ControllerAdvice 来声明一些全局性的东西,最常见的是结合 @ExceptionHandler 注解用于全局异常的处理。
  • @ControllerAdvice 是在类上声明的注解,其用法主要有三点:
  • @ExceptionHandler 注解标注的方法:用于捕获 Controller 中抛出的不同类型的异常,从而达到异常全局处理的目的;
  • @InitBinder 注解标注的方法:用于请求中注册自定义参数的解析,从而达到自定义请求参数格式的目的;
  • @ModelAttribute 注解标注的方法:表示此方法会在执行目标 Controller 方法之前执行 。
3、测试 Controller
@PostMapping(value = "https://www.it610.com/test") public AbstractBaseResult query(QueryRecord record) throws Exception { throw new RequestLimitException(); // 测试抛出自定义异常 }

【SpringBoot 统一异常处理】根据自己的业务进行抛出和处理。
4、测试结果 SpringBoot 统一异常处理
文章图片

    推荐阅读