java - 配置 View 未找到异常以显示 404

标签 java spring spring-mvc http-status-code-404 tomcat6

在我们的服务器中,我们有一个通用的 servlet 映射

  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

问题在于,并非每个 *.do url 都在 Controller 中配置,因此调用不存在的以 *.do 结尾的 url 会产生 500 错误,而不以 *.do 结尾的相同不存在 url 将返回正确的错误404

所以我想做的就是配置 DispatcherServlet 在这种情况下返回 404,或者至少捕获所有这些异常并返回 404。

最佳答案

在 Controller 类中添加上述方法。每个将抛出的异常,甚至是 RuntimeException,都会从此方法中捕获。

@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Exception.class)
public ModelAndView handleException(Exception ex) {
    Logger.getLogger(GuestNavController.class).error(ex);
    ModelAndView modelAndView = initializeModelAndView("guest/error500");

    return modelAndView;
}

很明显,如果您更改@ExceptionHandler异常参数和方法参数(它们必须相同),您将能够捕获特定的异常。

如果您有多个 Controller 类,您应该创建一个 Controller 建议。您可以在源代码中添加上述类。

@ControllerAdvice
public class ExceptionManager {
    private final Logger logger = Logger.getLogger(ExceptionManager.class);

    @ResponseStatus(HttpStatus.NOT_FOUND)
    @ExceptionHandler(NoHandlerFoundException.class)
    public ModelAndView handleError404(Exception ex) {
        logger.error("ERROR 404: " + ex.getMessage());

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("guest/error404");
        return modelAndView;
    }
}

您可以在此类中添加多个方法。此方法将捕获引发的每个异常。
小心如果您已包含上述两种解决方案。如果在包含带有 @ExceptionHandler 注释的方法的 Controller 中引发异常,则该异常将仅由该方法捕获,而不会从外部类捕获。外部类(解决方案 2)将捕获内部方法(解决方案 1)未捕获的异常。

关于java - 配置 View 未找到异常以显示 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13840996/

相关文章:

java - 如何将 JavaFX 菜单栏保留在窗口顶部

Spring @Autowireing 与通用工厂构建的 bean

java - 如何在 JdbcTemplate 中将 IN() 子句与 List 一起使用?

mysql - 为什么在使用 SpringJUnit4ClassRunner/MySQL/Spring/Hibernate 时事务不回滚

java - 返回 JSON 的 Spring Restful Web 服务

java - 处理单个 CQ 组件后获取 HTML 输出

java - 为什么 Java 的 String 中的 hashCode() 使用 31 作为乘数?

java - 如何使用 Spring MVC 将 bean 的返回值传递给其他 bean

spring-mvc - Spring Boot 执行器信息

java - Spring MVC 在重定向到默认(欢迎)页面时传递数据 - 模型消失了