• 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;
    }
    }
  • 相关阅读:
    【好书摘要】性能优化中CPU、内存、磁盘IO、网络性能的依赖
    【转】性能调优从哪里入手
    【转】从来没有冲突的团队是最糟糕的团队
    【转】华为Java编程军规,每季度代码验收标准
    【转】性能测试随笔,看看罢了,只做笑谈尔。
    MVC的JsonResult用法
    artDialog
    js apply/call/caller/callee/bind使用方法与区别分析
    jquery的each()详细介绍
    ASP.NET 4.5.256 has not been registered on the Web server
  • 原文地址:https://www.cnblogs.com/FlyAway2013/p/7944703.html
Copyright © 2020-2023  润新知