全局异常处理器
1.实现统一的返回值
- success:表示接口是成功还是失败
- code:错误码,当有异常的时候,可以返回具体的错误码
- msg:提示信息,比如:操作成功、用户名有误、密码有误等等
- data:类型是一个泛型,表示任意类型,这个用来存放接口中具体返回的数据,可以是任意类型的对象
/**
* rest接口通用返回值数据结构
*
* @param <T>
*/
public class ResultDto<T> {
//接口状态(成功还是失败)
private Boolean success;
//错误码
private String code;
//提示信息
private String msg;
//数据
private T data;
public Boolean getSuccess() {
return success;
}
public void setSuccess(Boolean success) {
this.success = success;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public static <T> ResultDto<T> success(T data) {
return success(data, "操作成功!");
}
public static <T> ResultDto<T> success(T data, String msg) {
ResultDto<T> result = new ResultDto<>();
result.setSuccess(Boolean.TRUE);
result.setMsg(msg);
result.setData(data);
return result;
}
public static <T> ResultDto<T> error(String msg) {
return error(null,msg);
}
public static <T> ResultDto<T> error(String code,String msg) {
return error(code,msg,null);
}
public static <T> ResultDto<T> error(String code, String msg, T data) {
ResultDto<T> result = new ResultDto<>();
result.setSuccess(Boolean.FALSE);
result.setCode(code);
result.setMsg(msg);
result.setData(data);
return result;
}
}
2.统一处理异常
将异常都放到一个地方处理,而不再需要在每个controller方法中进行异常处理。
流程:
定义自定义异常 --> 定义全局异常处理器类 --> 在controller中直接抛出自定义异常的方法让全局异常处理器拦截到后进行处理。
a.自定义异常
/**
* 业务异常
*/
public class BusException extends RuntimeException {
//异常错误码
private String code;
//错误扩展信息
private Object data;
public BusException(String msg) {
this(null, msg);
}
public BusException(String code, String msg) {
this(code, msg, null);
}
public BusException(String code, String msg, Object data) {
super(msg);
this.code = code;
this.data = data;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public static void throwBusException(String msg) {
throwBusException(null, msg);
}
public static void throwBusException(String code, String msg) {
throwBusException(code, msg, null);
}
public static void throwBusException(String code, String msg, Object data) {
throw new BusException(code, msg, data);
}
}
b.全局异常统一处理类:GlobalExceptionHandle
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* 全局异常处理
*/
@RestControllerAdvice // @ResponseBody+ControllerAdvice
public class GlobalExceptionHandle {
/**
* 统一处理业务异常
*
* @param e
* @param <T>
* @return
*/
@ExceptionHandler(BusException.class)
public <T> ResultDto<T> doBusException(BusException e) {
//1、记录错误日志
//2、返回结果
return ResultDto.error(e.getCode(), e.getMessage(), (T) e.getData());
}
/**
* 处理其他异常
*
* @param e
* @param <T>
* @return
*/
@ExceptionHandler
public <T> ResultDto<T> doException(Exception e) {
//1、记录错误日志
//2、返回结果
return ResultDto.error("系统异常,请联系管理员,错误详情:" + e.getMessage());
}
}
c.controller方法中异常的书写方式
@RestController
@RequestMapping("/user")
public class UserController {
/**
* 获取用户id
*
* @param code
* @return
*/
@RequestMapping("/getUserName")
public ResultDto<String> getUserName(@RequestParam("code") Integer code) {
if (!Integer.valueOf(6666).equals(code)) {
//验证码有误的时候,返回4001错误码
BusException.throwBusException("4001", "验证码有误!");
}
return ResultDto.success("成功");
}
/**
* 获取用户id
*
* @param code
* @return
*/
@RequestMapping("/getUserId")
public ResultDto<String> getUserId(@RequestParam("code") Integer code) {
if (!Integer.valueOf(6666).equals(code)) {
BusException.throwBusException("4001", "验证码有误!");
}
return ResultDto.success("成功");
}
}