一、序言
全局异常处理@RestControllerAdvice并非可以解决所有异常返回信息,
像是在Filter中的异常,Advice就失效了,就需要从别的方面进行入手
二、解决问题
1、代码实现
添加下方这个类,即可完美解决问题,其中ResponseEntity为spring自带类,Result为自定义返回前端实体类
请重点注意,我这里是采用@Override,也就是重写了error方法,也只有这样才能实现效果
import com.dely.common.entity.Result;
import org.springframework.boot.autoconfigure.web.ErrorProperties;
import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController;
import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* @author ruiMin
* @date 2020/2/20 21:55
*/
@RestController
public class ErrorController extends BasicErrorController {
/**
* 必须实现的一个构造方法
**/
public ErrorController() {
super(new DefaultErrorAttributes(), new ErrorProperties());
}
/**
* produces 设置返回的数据类型:application/json
*
* @param request 请求
* @return 自定义的返回实体类
*/
@Override
@RequestMapping(produces = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
Map<String, Object> body = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.ALL));
HttpStatus status = getStatus(request);
// 获取错误信息
String message = body.get("message").toString();
return new ResponseEntity<>(Result.error(message), status);
}
}
2、效果
这里就实现了按我自定义的格式发送消息,原效果请看下方原理解析图片
3、原理解析
其实原理也不复杂,就是,springboot在遇到错误的时候,是由自己的一套错误提示逻辑的,如以下图两种情况,由于我的项目是前后端分离项目,故这里只针对第二种进行重写,我们做的方法,就是继承BasicErrorController,然后重写关于ajax请求的实体信息返回
1)页面访问的形式
2)ajax接口访问形式
4、Result类
import com.dely.common.constant.HttpStatus;
import java.util.HashMap;
/**
* 用于返回成功失败错误的结果信息及状态
*
* @author ruiMin
* @date 2019-09-20 20:18
*/
public class Result extends HashMap<String, Object> {
/**
* 状态码
*/
private String status = "status";
/**
* 返回内容
*/
private String message = "message";
/**
* 数据对象
*/
private String data = "data";
public Result() {
}
/**
* 初始化一个新创建的 Result 对象
*
* @param status
* @param message
*/
public Result(Integer status, Object message) {
this.put(this.status, status);
this.put(this.message, message);
}
/**
* 初始化一个新创建的 Result 对象
*
* @param message
* @param data
*/
public Result(Integer status, Object message, Object data) {
this.put(this.status, status);
this.put(this.message, message);
this.put(this.data, data);
}
/**
* 自定义拓展状态消息
*/
public static Result msg(Integer status, Object msg) {
return new Result(status, msg, null);
}
/**
* 返回成功消息
*
* @return 成功消息
*/
public static Result success() {
return Result.success("操作成功");
}
/**
* 返回成功数据
*
* @return 成功消息
*/
public static Result success(Object data) {
return Result.success("操作成功", data);
}
/**
* 返回成功消息
*
* @param msg 返回内容
* @return 成功消息
*/
public static Result success(String msg) {
return Result.success(msg, null);
}
/**
* 返回成功消息
*
* @param msg 返回内容
* @param data 数据对象
* @return 成功消息
*/
public static Result success(String msg, Object data) {
return new Result(HttpStatus.SUCCESS, msg, data);
}
/**
* 返回失败消息
*
* @return 失败消息
*/
public static Result fail() {
return Result.fail("操作失败");
}
/**
* 返回失败消息
*
* @param msg 返回内容
* @return 失败消息
*/
public static Result fail(String msg) {
return Result.fail(msg, null);
}
/**
* 返回失败消息
*
* @param msg 返回内容
* @param data 数据对象
* @return 失败消息
*/
public static Result fail(String msg, Object data) {
return new Result(HttpStatus.FAIL, msg, data);
}
/**
* 特定状态码返回失败信息
*
* @param status 状态
* @param msg 信息
* @return
*/
public static Result fail(Integer status, String msg) {
return new Result(status, msg, null);
}
/**
* 返回错误消息
*
* @return 错误消息
*/
public static Result error() {
return Result.error("未知异常,请联系管理员");
}
/**
* 返回错误消息
*
* @param msg 返回内容
* @return 错误消息
*/
public static Result error(String msg) {
return Result.error(msg, null);
}
/**
* 返回错误消息
*
* @param msg 返回内容
* @param data 数据对象
* @return 错误消息
*/
public static Result error(String msg, Object data) {
return new Result(HttpStatus.ERROR, msg, data);
}
/**
* 特定状态码返回错误信息
*
* @param status 状态
* @param msg 信息
* @return
*/
public static Result error(Integer status, String msg) {
return new Result(status, msg, null);
}
@Override
public Result put(String key, Object value) {
super.put(key, value);
return this;
}
}