zoukankan      html  css  js  c++  java
  • 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;
    }
    }
  • 相关阅读:
    linux添加超级用户
    MongDB配置方法
    【bzoj5174】[Jsoi2013]哈利波特与死亡圣器 二分+树形dp
    【bzoj3560】DZY Loves Math V 欧拉函数
    【bzoj5157】[Tjoi2014]上升子序列 树状数组
    【uoj#317】[NOI2017]游戏 2-SAT
    【bzoj5146】有趣的概率 微积分
    【bzoj4695】最假女选手 线段树区间最值操作
    【bzoj4355】Play with sequence 线段树区间最值操作
    【loj2319】[NOIP2017]列队 Splay(卡过)
  • 原文地址:https://www.cnblogs.com/FlyAway2013/p/7944703.html
Copyright © 2011-2022 走看看