spring boot 错误处理总结

在boot 中, 对404  和 异常 有了额外的处理。 当然,我们可以定制, 如何做呢? 

1 写一个继承 ErrorController 的Controller

注意, 这里一定要继承 ErrorController 。 否则就boot会 启动失败,因为mapping 冲突, 因为不允许两个相同的 /error 映射嘛! 

@Controller
public class ErrContrller implements ErrorController {

//    @Override
    public String getErrorPath() { // 发现这里的 getErrorPath 完全没卵用!  返回什么值都可以, 不知道为什么。  
        return "/error123";
    }

    @RequestMapping("/error") // 这里的路径 就是boot 的异常请求的指向的路径。 可以再 application.properties里面配置, 当然, 需要这这里匹配
//    @ResponseBody
    public String  err(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("request = [" + request + "], response = [" + response + "]");
        return "someErr";
    }

    @RequestMapping("/eeeeeeeeee")
//    @ResponseBody
    public String  login(HttpServletRequest request, HttpServletResponse response) {
        return "login";
    }

写一个继承 ErrorController 的Controller 之后, boot 中原来的 BasicErrorController 就失效了, 那就是说 这样后 boot 不会对 404 进行额外处理。(但是异常还是会的? )。 因为 它是一个条件 bean。

2 注册一个 EmbeddedServletContainerCustomizer 

如下:

@Configuration
public class ErrorPageConfig {
    public static Logger logger = LoggerFactory.getLogger(ErrorPageConfig.class);
    @Bean
    public EmbeddedServletContainerCustomizer containerCustomizer() {
        return (ConfigurableEmbeddedServletContainer container) -> {
            /**
             * 页面异常错误
             */
            container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/error2/4xx")); 这里的value 如果是 html 结尾的, 那么就直接查找对应的html, 否则就会 再次转发请求给 spring mvc 
            container.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/500"));
        };
    }
}

那么,EmbeddedServletContainerCustomizer 的作用点是  ? 前面的博客已经有讲过啦。

有了它之后, 貌似所有的ErrorController 全部失效, 包括BasicErrorController   和上面自定义的 ErrorController 。 当然,之前在ErrorController 配置的 @RequestMapping("/error")  等 /error 配置还是有用的, 只不过是, boot 不在会转发 到这来了。!!

3 配置@ControllerAdvice  和 @ExceptionHandler 

当然, 这个其实就是spring mvc  的范畴了。 而且 @ExceptionHandler 只能处理 异常, 不能处理 404 : 

@ControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(value = Exception.class)
@ResponseBody
public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e){
System.out.println("req = [" + req + "], e = [" + e + "]");
ModelAndView modelAndView =new ModelAndView();
modelAndView.addObject("exception",e);
modelAndView.addObject("url",req.getRequestURI());
modelAndView.setViewName("error");
return modelAndView;
}
}
原文地址:https://www.cnblogs.com/FlyAway2013/p/7944703.html