总结一个大坑,今天在整理异常处理时遇到两个大坑:
第一个:不要用error、success等关键字配置跳转路径名
第二个:一定要看清你定义的类名,千万不要和异常类重名了
在springboot中自定义配置异常、全局异常,给用户一个比较好的体验,抛异常时能够跳转异常页面而不是直接将异常抛给用户:
一、自定义异常页面:
二、配置统一异常助手
全局捕获异常:@ControllerAdvice
捕获运行时异常:@ExceptionHandler(RuntimeException.Class)
实现原理:使用Aop的异常通知
package com.mybatis.exception;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@ControllerAdvice(basePackages={"com.gfk.controller"})
public class IExceptionHandler {
private static Logger log = LoggerFactory.getLogger(IExceptionHandler.class);
//统一异常助手类
public static final String ERROR_VIEW="error";
//运行时异常,拦截的错误
@ExceptionHandler(value=Exception.class)
public Object errorHandler(HttpServletResponse response,
HttpServletRequest request,Exception e) throws Exception{
e.printStackTrace();
ModelAndView mav =new ModelAndView();
mav.addObject("exception",e);
mav.addObject("url",request.getRequestURL());
mav.setViewName(ERROR_VIEW);
log.info("--------------------------------------:"+e);
return mav;
}
}
三、产生异常的控制器
package com.mybatis.controller;
import com.mybatis.pojo.Person;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
//@RestController
@Controller //如果引用了thymeleaf,就要配合@Controller使用,使用ResponseController会返回字符串
public class helloController {
private static Logger log = LoggerFactory.getLogger(helloController.class);
@GetMapping("/ero")
public String error(){
int a=1/0;
log.info("---------------------:"+a);
return "error";
}
}
四、运行结果