Java 用于捕获错误的Spring Exception Handler控制器不工作

Java 用于捕获错误的Spring Exception Handler控制器不工作,java,spring,jsp,model-view-controller,Java,Spring,Jsp,Model View Controller,我正在尝试创建一个控制器,这样当用户转到一个不存在的URL时,他/她将被映射到一个自定义错误页面“error.jsp” 当前,我的异常处理程序控制器如下所示: @ControllerAdvice public class ExceptionHandlerController { private static final Logger logger = LoggerFactory.getLogger(ExceptionHandlerController.class); @Exc

我正在尝试创建一个控制器,这样当用户转到一个不存在的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";
    }
}
然而,当我运行我的web应用程序并访问一个不存在的URL时,我会被重定向到默认的浏览器页面,并说“404此页面不能为页面。”

有没有人对为什么这不起作用有什么想法或建议?

来自

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

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

  • 创建SimpleMappingExceptionResolver并注册为bean

    @Bean
    HandlerExceptionResolver customExceptionResolver(){
    SimpleMappingExceptionResolver s=新的SimpleMappingExceptionResolver();
    属性p=新属性();
    //将spring内部错误NoHandlerFoundException映射到视图名称。
    p、 setProperty(NoHandlerFoundException.class.getName(),“错误页”);
    s、 设置例外应用程序(p);
    //如果要发送非默认值200的代码,请取消对以下行的注释
    //s、 addStatusCode(“错误页”,HttpStatus.NOT_FOUND.value());

    }


  • 在dispatcherServlet中将setThroweExceptionIfNoHandlerFound设置为true
  • p


    请参阅完整的示例。

    我已经完成了这两个步骤,并遵循了您提供的示例,但仍然没有将其映射到正确的错误页面。
      //This resolver will be processed before default ones
      s.setOrder(Ordered.HIGHEST_PRECEDENCE);
      return s;
    
    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;
      }
    
    }