在我们的服务器中,我们有一个通用的 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/