首先,可以整一个返回类,该类可以用于所有接口的返回,不管是否请求成功。
如下:
public class Result<T> implements Serializable{
private Integer code;//状态码
private boolean flag; //执行结果,true为执行成功 false为执行失败
private String message; //返回结果信息,主要用于页面提示信息
public T data; //返回数据
public Result() {
}
public Result(boolean flag, String message, T data) {
this.flag = flag;
this.message = message;
this.data = data;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
返回数据类型为T,是为了能插入不定类型数据。
异常捕获类,
注意三点:
1.@RestControllerAdvice,决定捕获哪个层面的异常。
2.@ExceptionHandler(RuntimeException.class),决定捕获哪些异常,括号里面可写多个异常类。
3.@ResponseBody返回方式
如下:
@RestControllerAdvice
public class NoPermissionExceptionHandler {
public static final String DEFAULT_ERROR_VIEW = "error/error";
private static final String logExceptionFormat
= "Capture Exception By NoPermissionExceptionHandler: Code: %s Detail: %s";
public static Logger logger = LoggerFactory.getLogger(NoPermissionExceptionHandler.class);
/**
*
* 功能描述:全局异常处理
* @Author 李
* @MethodName handleException
* @Date 10:30 2020/11/12
* @param request
* @param e
* @return java.lang.Object
* @exception
**/
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public Object handleException(HttpServletRequest request, RuntimeException e){
if(isAjax(request)){
return ajaxException(e);
}else {
return otherException(e);
}
}
/**
*
* 功能描述:判断是否ajax请求
* @Author 李
* @MethodName isAjax
* @Date 10:18 2020/11/12
* @param request
* @return boolean
* @exception
**/
private static boolean isAjax(HttpServletRequest request) {
return (request.getHeader("X-Requested-With") != null &&
"XMLHttpRequest".equals(request.getHeader("X-Requested-With")));
}
/***
*
* 功能描述:ajax请求异常处理
* @Author 李
* @MethodName ajaxException
* @Date 10:23 2020/11/12
* @param e
* @return acw.com.sys.config.Result
* @exception
**/
private static <E> Result<E> ajaxException(RuntimeException e){
Integer data = 0;
String msg = "";
if (e instanceof UnauthenticatedException){
data = 10086;
msg = "未登录或登录已过期";
}else if(e instanceof UnauthorizedException){
data = 95599;
msg = "没有该权限";
}else if (e instanceof IncorrectCredentialsException){
data = 10010;
msg = "用户名或密码错误";
}else if (e instanceof MyShiroException){
data = ((MyShiroException) e).getCode();
}else if(e instanceof DisabledAccountException){
data = 10010;
msg = "用户被冻结";
}else if(e instanceof MyException){
data = ((MyException) e).getCode();
}else{
data = 666666;
msg = "网络波动,请稍后再试"+e.getMessage();
}
return (Result<E>) exceptionFormat(data, e,msg);
}
/**
*
* 功能描述:非ajax请求异常
* @Author 李
* @MethodName otherException
* @Date 10:26 2020/11/12
* @param e
* @return org.springframework.web.servlet.ModelAndView
* @exception
**/
private static ModelAndView otherException(RuntimeException e){
ModelAndView mv = new ModelAndView();
if (e instanceof UnauthenticatedException){
mv.addObject("massage","未登录或登录已过期");
}else if(e instanceof UnauthorizedException){
mv.addObject("massage","没有该权限");
}else if (e instanceof IncorrectCredentialsException){
mv.addObject("massage","用户名或密码错误");
}else if (e instanceof MyShiroException){
mv.addObject("massage",e.getMessage());
}else if(e instanceof DisabledAccountException){
mv.addObject("massage","用户被冻结");
}else {
mv.addObject("massage","网络波动,请稍后再试"+e.getMessage());
}
mv.setViewName(DEFAULT_ERROR_VIEW);
logger.error(e.getMessage());
return mv;
}
/**
*
* 功能描述:返回值前的泛型是参数T和E的
* @Author 李培
* @MethodName exceptionFormat
* @Date 11:25 2020/12/29
* @param data
* @param ex
* @param msg
* @return acw.com.sys.config.Result
* @exception
**/
private static <T extends Throwable,E> Result<E> exceptionFormat(E data, T ex , String msg) {
Result<E> result = new Result<>();
logger.error(String.format(logExceptionFormat, data, ex.getMessage()));
result.setData(data);
result.setMessage(StringUtils.isEmpty(msg)?ex.getMessage():msg);//有msg传msg,无msg传ex.getMessage()
result.setFlag(false);
return result;
}
}
返回值前的泛型中,T和E可以理解为初始化定义,定义参数中的T和E。
捕获的异常,可以尽量写详细点,以便精确处理,虽然代码工的职责是写bug,但是bug多了也是会烦的。