首页 文章

如何用Spring MVC覆盖Jetty的404错误?

提问于
浏览
0

当我到达非现有页面时,我得到:

HTTP ERROR 404访问/swagger-ui.ht时出现问题 . 原因:未找到

所以要覆盖我创建的jetty的404错误页面:

WEB-INF / JSP / 404.jsp

<html>
<head>
    <title>Error Page</title>
</head>
<body>
    <p>An error occured, please contact webmaster.</p>
</body>

WEB-INF / web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

   <error-page>
   <error-code>404</error-code>
   <location>/WEB-INF/jsp/404.jsp</location>
   </error-page>

</web-app>

我相信,我需要在WebMvcConfigurerAdapter中创建一些Bean,但我找不到合适的Bean . 事实是,我已经拥有@RestControllerAdvice,所以这不应该覆盖我的控制器建议 .

什么是正确的方法?

3 回答

  • 0

    也许尝试使用注释

    class MyController {
        @ExceptionHandler(ResourceNotFoundException.class)
        @ResponseStatus(HttpStatus.NOT_FOUND)
        public ModelAndView handleNotFound() {
            return new ModelAndView("redirect:/error.htm");
        }
    }
    
  • 1

    所以有一个解决方案:当没有请求处理程序时,你需要设置DispatcherServlet来抛出exeptions:

    dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
    

    然后,当您尝试访问某个 endpoints 并且控制器中没有处理程序时,spring将抛出NoHandlerFoundException . 您可以在@ControllerAdvice中处理:

    @ExceptionHandler({NoHandlerFoundException.class})
    public ResponseEntity<> handle(NoHandlerFoundException e, Locale locale) {
        ....
    }
    
  • 1

    由于您使用 Spring MVC 处理webapp,我会做的是创建一个客户 Exception 处理程序,每次请求不存在的资源时都会调用该处理程序

    像这样的东西:

    @ExceptionHandler(ResourceNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public String handleResourceNotFoundException() {
        return "errorPage.html";
    }
    

    这样,您可以为每个 @Controller 配置不同的页面(如果需要) . 你有更大的灵活性 .

相关问题