0

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

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

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

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

4

2 回答 2

1

在控制器类中添加上述方法。每个将被抛出的异常,甚至是 RuntimeExceptions,都将从这个方法中被捕获。

@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 异常参数和方法参数(它们必须相同),您将能够捕获特定异常。

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

@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 注释的方法的控制器中引发异常,则该异常将仅由该方法捕获,而不会从外部类捕获。外部类(解决方案 2)将捕获内部方法未捕获的异常(解决方案 1)。

于 2016-04-25T12:37:38.990 回答
0

除了<error-page/>在部署描述符中配置一个元素来专门捕获404错误或者您没有任何其他选择。404如果您使用的是完整的 Web 应用程序容器,例如 glassfish,您还可以选择在容器级别覆盖页面。根据配置在此处查找您的选项(servlet 3.0 有一个新选项)

请注意,在 JavaEE 堆栈中没有 a 这样的东西ViewNotFoundException(我检查过以绝对确定),因为容器会在第一个提示时跳入并控制它,它提供服务请求的资源的能力可能从根本上出错

作为开发人员,4XX系列状态代码通常不受您的控制,因为它们描述了您很可能无法处理(等)或不应处理的错误情况401-forbidden404-Not found有点像 java 的运行时异常。

于 2012-12-13T07:42:34.980 回答