-
为什么要配置全局异常?
- 不配全局服务端报错场景 1/0、空指针等 返回前端错误代码 用户体验不佳
-
配置好处
- 统一的错误页面或者错误码
- 对用户更友好
-
Springboot 怎么在项目中配置全局异常
-
类添加注解
- @ControllerAdvice,如果需要返回json数据,则方法需要加@ResponseBody
- @RestControllerAdvice, 默认返回json数据,方法不需要加@ResponseBody
-
方法添加处理器
- 捕获全局异常,处理所有不可知的异常
- @ExceptionHandler(value=Exception.class)
- 注释:Exception.class 可自定义异常
-
完整代码如下
//或 @ControllerAdvice + 方法上加@ResponseBody 返回json数据 @RestControllerAdvice public class GlobalExceptionHandler { protected static Log log = LogFactory.getLog(com.blockchain.controller.base.BaseController.class); @Autowired private MemberService memberService; @ExceptionHandler(Exception.class) //或者自定义异常 BusinessException.class public MessageResult exceptionResult(HttpServletRequest request, HttpServletResponse response, Exception e) { //获得请求人id HttpSession session = request.getSession(); AuthMember user = (AuthMember) session.getAttribute(SysConstant.SESSION_MEMBER); Member member = null; if (ObjectUtils.isEmpty(user)) { String token = request.getHeader("access-auth-token"); if (StringUtils.isEmpty(token)) { token = request.getHeader("x-auth-token"); } if (!ObjectUtils.isEmpty(token)){ user = (AuthMember) session.getAttribute(token); if (ObjectUtils.isEmpty(user)){ member = memberService.loginWithToken(token, request.getRemoteAddr(),""); } } } Integer memberId=null; if (!ObjectUtils.isEmpty(user)){ memberId=user.getUserId(); }else if(!ObjectUtils.isEmpty(member)){ memberId=member.getId(); } //获得请求参数 Map<String, String[]> parameterMap = request.getParameterMap(); String json= JSONObject.toJSON(parameterMap).toString(); log.error("全局异常:"+""+"请求方法:"+request.getMethod()+",请求接口:"+request.getRequestURI()+",请求人id:"+memberId+",请求参数:"+"["+json+"]",e); return error(-1,"服务器内部错误 请联系管理员"); }
BusinessException.class //自定义异常
public class BusinessException extends RuntimeException { public final static int DEFAULT_BIZ_ERROR_CODE = 9; public final static int DEFAULT_SYS_ERROR_CODE = 99; protected int errorCode = DEFAULT_BIZ_ERROR_CODE; // 错误码默认为9 protected String errorMessage = null; // 错误消息默认为null private String[] args = null; public BusinessException(int errorCode) { super(""); this.errorCode = errorCode; } public BusinessException(int errorCode, String[] args) { super(""); this.errorCode = errorCode; this.args = args; } public BusinessException(int errorCode, String arg ) { super(""); this.errorCode = errorCode; this.args =new String[]{ arg}; } public BusinessException(MessageCode message) { super(""); this.errorCode = message.getValue(); this.errorMessage = message.getCnName(); } public String[] getArgs() { return args; } public int getErrorCode() { return errorCode; } public void setErrorCode(int errorCode) { this.errorCode = errorCode; } public String getErrorMessage() { return errorMessage; } public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; } }
使用SpringBoot自定义异常和错误页面跳转
- 返回自定义异常界面,需要引入thymeleaf依赖(非必须,如果是简单的html界面则不用)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
- resource目录下新建templates,并新建error.html
ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("error.html"); modelAndView.addObject("msg", e.getMessage()); return modelAndView;