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;
    }
    }
  • 相关阅读:
    Max History CodeForces
    Buy a Ticket CodeForces
    AC日记——字符串的展开 openjudge 1.7 35
    AC日记——回文子串 openjudge 1.7 34
    AC日记——判断字符串是否为回文 openjudge 1.7 33
    AC日记——行程长度编码 openjudge 1.7 32
    AC日记——字符串P型编码 openjudge 1.7 31
    AC日记——字符环 openjudge 1.7 30
    AC日记——ISBN号码 openjudge 1.7 29
    AC日记——单词倒排 1.7 28
  • 原文地址:https://www.cnblogs.com/FlyAway2013/p/7944703.html
Copyright © 2011-2022 走看看