在项目中配置新velocity页面时,偶尔会出现404的错误。经过排查,最终找到是页面缓存问题。
说下排查思路:
1、首先排除url链接、vm页面的可能,跟踪 Controller 处理也是正常,故定位在页面渲染过程中。
2、跟踪 DispatcherServlet 的 doDispatch() 方法,进入render() 方法中,此处包含了两步,首先获取view,然后渲染 view。
3、跟进获取 view 的 resolveViewName() 方法里,这里会遍历 viewerResolver,然后分别进行 view 获取。
protected View resolveViewName(String viewName, Map<String, Object> model, Locale locale,
HttpServletRequest request) throws Exception {
for (ViewResolver viewResolver : this.viewResolvers) {
View view = viewResolver.resolveViewName(viewName, locale);
if (view != null) {
return view;
}
}
return null;
}
4、velocity页面首先使用 FixedVelocityLayoutViewResolver 解析器进行解析,此时返回了 null 结果,故继续用其他解析器进行解析,最终在对应路径不能找到文件,所以跳转到404页面。
实际此处 FixedVelocityLayoutViewResolver 应该返回解析好的vm页面,而不是null,故问题就在此处。