我正在研究如何在一个教程中处理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不存在) )进入返回的视图?
答案 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
注释结合使用,为每个控制器启用此功能。