全局异常处理器
1.全局异常处理器
在项目中自定义一个全局异常处理器,在异常处理器上加上注解 @ControllerAdvice,可以通过属性annotations指定拦截哪一类的Controller方法。 并在异常处理器的方法上加上注解 @ExceptionHandler 来指定拦截的是那一类型的异常。
例如:
import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;import java.sql.SQLIntegrityConstraintViolationException;/*** 全局异常处理*/@ControllerAdvice(annotations = {RestController.class, Controller.class})@ResponseBody@Slf4jpublic class GlobalExceptionHandler {/*** 异常处理方法* @return*/@ExceptionHandler(SQLIntegrityConstraintViolationException.class)public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){log.error(ex.getMessage());if(ex.getMessage().contains("Duplicate entry")){String[] split = ex.getMessage().split(" ");String msg = split[2] + "已存在";return R.error(msg);}return R.error("未知错误");}}
注解说明:
上述的全局异常处理器上使用了的两个注解 [@ControllerAdvice ](/ControllerAdvice ) , [@ResponseBody ](/ResponseBody ) , 他们的作用分别为:[@ControllerAdvice ](/ControllerAdvice ) : 指定拦截那些类型的控制器;@ResponseBody: 将方法的返回值 R 对象转换为json格式的数据, 响应给页面;上述使用的两个注解, 也可以合并成为一个注解 [@RestControllerAdvice ](/RestControllerAdvice )
springboot项目中集成全局异常全局处理器,把这个异常类注入到容器管理
spring.factories内容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.heima.common.exception.ExceptionCatch,\
2.自定义异常返回类型
public class Result<T> {private int code;private String msg;private T data;/*** 请求成功时调用* @param data* @return*/public static <T> Result<T> success(T data){return new Result<T>(data);}public static <T> Result<T> error(CodeMsg cm){return new Result<T>(cm);}/*** 只传入数据默认成功,所以添加默认的code和msg* @param data*/private Result(T data) {this.code=0;this.msg="success";this.data=data;}private Result(CodeMsg cm) {if(cm==null){return;}this.code=cm.getCode();this.msg=cm.getMsg();}public int getCode() {return code;}public String getMsg() {return msg;}public T getData() {return data;}}
public class CodeMsg {private int code;private String msg;//通用的错误码public static CodeMsg SUCCESS = new CodeMsg(0, "success");public static CodeMsg SERVER_ERROR = new CodeMsg(500100, "服务端异常");public static CodeMsg BIND_ERROR = new CodeMsg(500101, "参数校验异常:%s");//登录模块 5002XXpublic static CodeMsg SESSION_ERROR = new CodeMsg(500210, "Session不存在或者已经失效");public static CodeMsg PASSWORD_EMPTY = new CodeMsg(500211, "登录密码不能为空");public static CodeMsg STUDENTID_EMPTY = new CodeMsg(500212, "学号不能为空");public static CodeMsg STUDENTID_ERROR = new CodeMsg(500213, "学号格式错误");public static CodeMsg STUDENTIDE_NOT_EXIST = new CodeMsg(500214, "学号不存在");public static CodeMsg PASSWORD_ERROR = new CodeMsg(500215, "密码错误");public int getCode() {return code;}public String getMsg() {return msg;}public CodeMsg fillArgs(Object... args) {int code = this.code;String message = String.format(this.msg, args);return new CodeMsg(code, message);}private CodeMsg(int code,String msg) {this.code = code;this.msg = msg;}}
3.自定义异常类
public class GlobalException extends RuntimeException{private static final long serialVersionUID = 1L;private CodeMsg cm;public GlobalException(CodeMsg cm) {super(cm.toString());this.cm = cm;}public CodeMsg getCm() {return cm;}}
4.使用自定义异常类
使用自定义异常类实例
if(user == null) {throw new GlobalException(CodeMsg.STUDENTIDE_NOT_EXIST);}
