一、创建全局异常拦截类
package com.zx.framework.handler;
import com.zx.cargo.pojo.ResponseWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* 全局异常处理
*/
@Slf4j
@RestControllerAdvice(
basePackages = {
"com.zx.cargo.stock.controller",
"com.zx.cargo.code.controller"
}
)
public class GlobalExceptionHandler {
@ExceptionHandler({Throwable.class})
public ResponseWrapper handleException(Throwable cause) {
log.error("---start---全局异常-@see com.zx.framework.handler.HandlerException");
System.out.println("cause--->"+cause.getMessage());
cause.printStackTrace();
log.error("---end---全局异常-@see com.zx.framework.handler.HandlerException");
// 异常信息
String message = cause.getMessage();
if (StringUtils.isEmpty(message)) {
message = "服务器内部错误!";
}
return new ResponseWrapper<Boolean, String>().failure().setMessage(message);
}
}
了解 @ControllerAdvice
@ControllerAdvice是组件注解,他使得其实现类能够被classpath扫描自动发现,如果应用是通过MVC命令空间或MVC Java编程方式配置,那么该特性默认是自动开启的。
注解@ControllerAdvice的类可以拥有@ExceptionHandler, @InitBinder或 @ModelAttribute注解的方法,并且这些方法会被应用到控制器类层次的所有@RequestMapping方法上。
@ControllerAdvice会获取从Controller抛出的异常,只能获取从Controller抛出异常
二、拦截器转发异常信息
首先拦截器与过滤器 是在进入Controller层之前加载的,他们抛出的异常全局异常类拦截不到我们需要做一个异常信息的转发 获取到异常信息 将他抛出到Controller层
1.创建抛出异常的Controller
package com.zx.cargo.error.web;
import com.zx.cargo.pojo.GlobalException;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/**
* 全局过滤器 抛出异常 Controller
*/
@RequestMapping("/error")
@RestController
public class ErrorController {
@RequestMapping("/exception")
public void handleException(HttpServletRequest request) {
throw new GlobalException(request.getAttribute("error").toString());
}
}
2.在拦截器获取异常并重定向到异常Controller
try {
verify = JwtUtil.isVerify(token, user);
} catch (ExpiredJwtException jwtExp) {
// 异常捕获,发送到error controller
request.setAttribute("error", "登录超时,请重新登录");
//将异常分发到/error/exthrow控制器
request.getRequestDispatcher("/error/exception").forward(request, response);
}
前端vue进行配置
import {Loading, Message, MessageBox} from 'element-ui'
//响应回来token是否过期
Axios.interceptors.response.use(response => {
if (response.data && response.data.status === false) {
// 处理结果-未成功(skip为true跳过此处错误提示,在具体方法做处理)
if (response.data.skip === false) {
if (response.data.message) {
Message.error(response.data.message)
}
return Promise.reject(response.data.message)
}
}
return response
},
error => {
return Promise.reject(error)
})