Spring中HandlerExceptionResolver接口的工作原理是什么?当用户尝试访问未映射的资源时,是否可以显示错误页面?

时间:2015-12-02 18:25:24

标签: spring spring-mvc exception-handling

我正在研究如何在一个教程中处理Spring中的自定义异常,该教程向我展示了这个名为 ExceptionHandler 的类,它实现了 HandlerExceptionResolver Spring接口:

@Component
public class ExceptionHandler implements HandlerExceptionResolver {

    private static final Logger logger = LoggerFactory.getLogger(ExceptionHandler.class);

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception) {        
        System.out.println("Spring MVC Exception Handling");
        logger.error("Error: ", exception);     
        return new ModelAndView("error/exception","exception","ExceptionHandler message: " + exception.toString());
    }

}

然后,在示例的控制器类中,它以这种方式抛出此异常:

 @RequestMapping(value="/throwRunTimeException", method=RequestMethod.GET)
  public void throwException() {
     throw new RuntimeException();
  }

所以我对这门课程到底有多怀疑。

我无法理解是否实现了 HandlerExceptionResolver 接口我声明了一个新的特定异常类型,或者只是指定了在抛出泛型运行时异常时发生的特定行为。 / p>

我似乎是第二种情况......我认为,在前面的示例中,当抛出泛型 RuntimeException 时,它会返回 exception.jsp 页面(以及必须显示在模型对象中的相关消息)。

那么,如果前一个断言为真,我可以将这个方法用于下面的pourpose吗?

我认为当用户尝试打开未映射到任何控制器方法的URL时,会抛出RuntimeException

因此,在** resolveException()* *方法中,我是否可以从HttpServletRequest请求输入参数中提取所需的URL并使用它来显示特定的错误消息(表明此URL不存在) )进入返回的视图?

1 个答案:

答案 0 :(得分:2)

我认为这是不可能的。当DispatcherServlet无法找到其中一个控制器中映射的url时,它将抛出NoHandlerFoundException。然后,它将被转发到您的servlet容器,如Tomcat,它处理错误并显示404页面。您可以通过将以下内容添加到web.xml来更改此行为: `

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

`

请注意,它尚无法在JavaConfig中进行配置。

对于抛出的其他异常,您可以使用HandlerExceptionResolver返回所需的视图。

您还可以在控制器中的方法上使用@ExceptionHandler注释来捕获异常并适当地处理它们。这可以与@ControllerAdvice注释结合使用,为每个控制器启用此功能。