【问题标题】:Spring ExceptionHandlerController for catching errors is not working用于捕获错误的 Spring ExceptionHandlerController 不起作用
【发布时间】:2017-12-28 17:21:48
【问题描述】:

我正在尝试创建一个控制器,以便当用户访问不存在的 URL 时,他/她将被映射到自定义错误页面“error.jsp”。

目前,我的异常处理控制器如下所示:

@ControllerAdvice 
public class ExceptionHandlerController {
    private static final Logger logger = LoggerFactory.getLogger(ExceptionHandlerController.class);

    @ExceptionHandler(value = {Exception.class, RuntimeException.class})
    public String defaultErrorHandler(Exception e) {
        logger.error("Unhandled exception: ", e);
        return "error";
    }

    @ExceptionHandler(NoHandlerFoundException.class)
    public String handle(Exception e) {
        logger.error("No handler found!", e);
        return "error";
    }
}

但是,当我运行我的网络应用程序并访问一个不存在的 URL 时,我会被重定向到默认浏览器页面,提示“404 此页面不能是页面。

是否有人对为什么这不起作用有任何想法或建议?

【问题讨论】:

    标签: java spring jsp model-view-controller


    【解决方案1】:

    来自NoHandlerFoundException的javaDoc

    默认情况下,当 DispatcherServlet 找不到处理程序时 请求它发送一个 404 响应。但是,如果它的属性 “throwExceptionIfNoHandlerFound”设置为 true 这个异常是 引发并可以使用已配置的 HandlerExceptionResolver 进行处理。

    解决这个问题,你需要确保你做了这2件事

    1. 创建 SimpleMappingExceptionResolver 并注册为 bean

      @Bean HandlerExceptionResolver customExceptionResolver () { SimpleMappingExceptionResolver s = new SimpleMappingExceptionResolver(); Properties p = new Properties(); //mapping spring internal error NoHandlerFoundException to a view name. p.setProperty(NoHandlerFoundException.class.getName(), "error-page"); s.setExceptionMappings(p); //uncomment following line if we want to send code other than default 200 //s.addStatusCode("error-page", HttpStatus.NOT_FOUND.value());

        //This resolver will be processed before default ones
        s.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return s;
      

      }


    1. 在 dispatcherServlet 中将 setThrowExceptionIfNoHandlerFound 设置为 true

    p

    public class AppInitializer extends
            AbstractAnnotationConfigDispatcherServletInitializer {
    
      ....
      ......
    
      @Override
      protected FrameworkServlet createDispatcherServlet (WebApplicationContext wac) {
          DispatcherServlet ds = new DispatcherServlet(wac);
          //setting this flag to true will throw NoHandlerFoundException instead of 404 page
          ds.setThrowExceptionIfNoHandlerFound(true);
          return ds;
      }
    
    }
    

    参考完整示例here

    【讨论】:

    • 我做了这两件事并按照您提供的示例进行操作,但仍未映射到正确的错误页面。
    猜你喜欢
    • 2017-01-18
    • 2021-10-06
    • 2019-03-02
    • 1970-01-01
    • 2016-09-14
    • 2015-02-11
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    相关资源
    最近更新 更多