目录
此处主要对统一异常处理的方法和步骤进行详细笔记总结
一、编写异常信息枚举类
此处枚举的具体内容根据自己的业务需要进行添加,此处的状态码值自己设置,一般也可以使用HttpStatus的状态码,那个和HTTP协议的规范一直,如2xx表示请求成功,4xx表示资源找不到,500表示服务器错误等等,
public enum ResultEnum {
/** 成功 */
REQUEST_SUCCESS(200,"成功"),
/** 失败 */
REQUEST_FAILED(-1,"失败"),
/** 未知错误 */
UNKNOWN_ERROR(500,"未知错误");
/** 状态 */
private Integer code;
/** 含义 */
private String message;
ResultEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public String getMessage() {
return message;
}
}
二、编写自定义业务异常
一般自定义异常的属性信息都是通过构造方法,所以此处不需要set方法,一般自定义异常继承RuntimeException,而异常信息传参通过上一步定义的枚举对象
public class BusinessException extends RuntimeException{
private static final long serialVersionUID = -1260775338752265332L;
/** 异常状态码 */
private Integer code;
public BusinessException(ResultEnum resultEnum) {
super(resultEnum.getMessage());
this.code = resultEnum.getCode();
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
三、在Service层使用自定义异常
在自定义业务异常中指定枚举中管理的各种业务异常信息
@Override
public void save(Girl girl) {
Girl g = girlRepository.save(girl);
Optional<Girl> girlOptional = Optional.of(girl);
if(girlOptional.isPresent()){
throw new BusinessException(ResultEnum.REQUEST_FAILED);
}
}
四、编写统一响应结果类
public class Result<T> implements Serializable {
private static final long serialVersionUID = -7557258753883492883L;
/** 状态码 */
private Integer code;
/** 提示信息 */
private String msg;
/** 返回数据 */
private T data;
public Integer getCode() {
return code;
}
public void setCode(Integer 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;
}
@Override
public String toString() {
return "Result{" +
"code=" + code +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
}
五、编写处理返回给客户端结果的工具类
编写包含静态方法的工具类,抽取业务的重复代码部分进行封装
public class ResultUtil {
/**
* 处理请求成功,返回数据
*
* @param o 具体数据
* @return 返回统一响应结果
*/
public static Result<Object> success(Object o){
Result<Object> girlResult = new Result<>();
girlResult.setCode(1);
girlResult.setMsg("成功");
girlResult.setData(o);
return girlResult;
}
/**
* 处理请求成功,无数据返回
*
* @return 返回统一响应结果
*/
public static Result<Object> success(){
return success(null);
}
/**
* 失败请求
*
* @return 返回统一响应结果
*/
public static Result<Object> error(Integer code,String msg){
Result<Object> objectResult = new Result<>();
objectResult.setCode(code);
objectResult.setMsg(msg);
objectResult.setData(null);
return objectResult;
}
}
六、编写全局异常处理器
此处如果是返回统一响应结果的,则使用@RestControllerAdvice注解处理器类,如果需要返回页面的,则使用@ControllerAdvice,这里@ExceptionHandler指定处理的异常类型,一般如果项目的异常处理写的详细一点的话,还会添加认证异常、授权异常、参数校验异常,这里就不添加,网上太多这类博客了
@RestControllerAdvice
public class GlobalExceptionHandler {
/** 打印日志 */
private static final Logger log= LoggerFactory.getLogger(GlobalExceptionHandler.class);
/**
* 统一异常处理
*
* @param e 异常对象
* @return 统一响应结果
*/
@ExceptionHandler(value = Exception.class)
public Result<Object> handleException(Exception e){
if (e instanceof BusinessException){
BusinessException businessException=(BusinessException) e;
return ResultUtil.error(businessException.getCode(),e.getMessage());
}
log.error(" 系统异常 {} ",e);
return ResultUtil.error(-1,"未知错误,请联系系统管理员!");
}
}
此处只是针对个人以后使用做的笔记,没有太多详细的解读,仅供参考