springboot全局异常处理方式
globalexception
import lombok.extern.slf4j.slf4j;
import org.springframework.util.stringutils;
import org.springframework.validation.bindexception;
import org.springframework.validation.bindingresult;
import org.springframework.validation.fielderror;
import org.springframework.web.bind.methodargumentnotvalidexception;
import org.springframework.web.bind.annotation.controlleradvice;
import org.springframework.web.bind.annotation.exceptionhandler;
import org.springframework.web.bind.annotation.responsebody;
@slf4j
@responsebody
@controlleradvice
public class globalexception {
/**
* 系统异常处理
*
* @param ex 异常
* @return
*/
@exceptionhandler(value = throwable.class)
public result defaulterrorhandler(exception ex) {
log.error("系统异常:{}", ex);
return result.error(statusenum.system_error);
}
/**
* bindexception
*
* @param e 异常
* @return
*/
@exceptionhandler(bindexception.class)
public result handlebingexception(bindexception e) {
fielderror fielderror = e.getfielderror();
string message = fielderror.getdefaultmessage();
return result.error(statusenum.system_error);
}
/**
* 处理 @requestbody参数校验异常
*
* @param e 异常信息
* @return
*/
@exceptionhandler(methodargumentnotvalidexception.class)
public result handlemethodargumentnotvalidexception(methodargumentnotvalidexception e) {
bindingresult bindingresult = e.getbindingresult();
fielderror fielderror = bindingresult.getfielderror();
string code = fielderror.getcode();
string message = fielderror.getdefaultmessage();
return result.error(errorcode, message);
}
}result
@data
public class result<t> {
/**
* 状态值
*/
private boolean status;
/**
* 状态码
*/
private string code;
/**
* 状态信息
*/
private string message;
/**
* 返回的结果
*/
private t result;
/**
* 构造函数
*
* @param code 状态码
* @param message 提示信息
*/
public result(string code, string message) {
this.status = false;
this.code = code;
this.message = message;
}
/**
* 构造函数
*
* @param status 状态
* @param code 状态码
* @param message 提示信息
*/
public result(boolean status, string code, string message) {
this.status = status;
this.code = code;
this.message = message;
}
/**
* 构造函数
*
* @param status 状态
* @param code 状态码
* @param message 提示信息
* @param result 结果
*/
public result(boolean status, string code, string message, t result) {
this.status = status;
this.code = code;
this.message = message;
this.result = result;
}
// --------- 静态方法 ----------
/**
* 枚举的状态码
*/
private static final string code;
/**
* 枚举的提示信息
*/
private static final string message;
/**
* 500
*/
private static final string error_code;
/**
* 成功返回的状态码
*/
private static final string success_code;
/**
* 成功返回的状态信息
*/
private static final string success_msg;
/**
* 静态代码块初始化
*/
static {
// 成功返回的状态码
code = "getcode";
// 枚举的提示信息
message = "getmessage";
// 异常码
error_code = "500";
// 成功返回的状态码
success_code = "200";
// 成功返回的状态信息
success_msg = "操作成功";
}
/**
* 操作成功
*
* @return 返回结果
*/
public static result success() {
return new result(true, success_code, success_msg);
}
/**
* 操作成功
*
* @return 返回结果
*/
public static <t> result success(t result) {
return new result(true, success_code, success_msg, result);
}
/**
* 返回异常的
*
* @param t 泛型枚举
* @param <t> 泛型
* @return 返回 result
*/
public static <t extends enum> result error(t t) {
return error(t, code, message, null);
}
/**
* 返回异常的
*
* @param t 泛型枚举
* @param message 提示信息
* @param <t> 泛型
* @return 返回 result
*/
public static <t extends enum> result error(t t, string message) {
return error(t, code, message, message);
}
/**
* 返回异常的
*
* @param code 状态码
* @return 返回 result
*/
public static result error(string code) {
return new result(code, null);
}
/**
* 返回异常的
*
* @param code 状态码
* @param message 提示信息
* @return 返回 result
*/
public static result error(string code, string message) {
return new result(code, message);
}
/**
* 返回异常的
*
* @param t 返回的枚举
* @param codemethod 状态的方法
* @param msgmethod 提示信息的状态码
* @param <t> 泛型
* @return 返回 result 对象
*/
public static <t extends enum> result error(t t, string codemethod, string msgmethod, string message) {
try {
class<?> aclass = t.getclass();
string code = aclass.getmethod(codemethod).invoke(t).tostring();
message = stringutils.isempty(message) ? aclass.getmethod(msgmethod).invoke(t).tostring() : message;
return new result(code, message);
} catch (exception e) {
return new result(error_code, e.getmessage());
}
}
// ---- 重写的方法 ----
/**
* 重写 tostring 方法
*
* @return 返回json字符串
*/
@override
public string tostring() {
return json.tojsonstring(this);
}
/**
* tojsonstring 方法
*
* @return 返回json字符串
*/
public string tojsonstring() {
return json.tojsonstring(this);
}
}statusenum
public enum statusenum {
/**
* 操作成功
*/
ok("200", "操作成功"),
/**
* 没有访问权限
*/
not_permission("403", "没有访问权限"),
/**
* 没有登录或者登录已经过期
*/
not_login("405", "没有登录或者登录已经过期"),
/**
* 系统繁忙,请稍后再试
*/
system_error("500", "系统繁忙,请稍后再试");
/**
* 构造函数
*
* @param code 状态码
* @param message 提示信息
*/
statusenum(string code, string message) {
this.code = code;
this.message = message;
}
/**
* 状态码
*/
private string code;
/**
* 提示信息
*/
private string message;
/**
* 获取 状态码
*
* @return 状态码
*/
public string getcode() {
return code;
}
/**
* 获取 提示信息
*
* @return 提示信息
*/
public string getmessage() {
return message;
}
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论