现有Spring MVC+Apache Tiles JSP项目整合Thymeleaf返回404如何解决
问题解答
可以在项目中同时存在Tiles + JSP的视图解析流程和Thymeleaf模板解析流程,Spring MVC原生支持多视图解析器共存,只要配置好优先级和对应规则即可正常运行。
你当前配置存在4个核心错误,是导致404的直接原因:
- 你在Controller的
@PostConstruct中创建的ThymeleafViewResolver没有注册到Spring上下文,DispatcherServlet感知不到该解析器,不会用它处理视图解析。 - 调用
templateEngine.setTemplateResolver直接覆盖了原有Jar包依赖的StringTemplateResolver,会导致其他依赖该解析器的功能失效,应该追加而非替换模板解析器。 - 模板路径配置错误,
SpringResourceTemplateResolver默认从ServletContext根路径(webContent目录)加载资源,你的templates目录存放在类路径下,需要加classpath:前缀才能正确定位。 - web.xml中DispatcherServlet的映射规则是
*.*,不带后缀的请求不会进入Spring处理流程,访问时需要加后缀。
修改方案
1. 新增独立的Thymeleaf配置类
不要将解析器配置写在Controller的初始化方法中,单独声明Spring托管的配置类:
@Configuration public class ThymeleafConfig { @Autowired private SpringTemplateEngine templateEngine; @Bean public SpringResourceTemplateResolver htmlTemplateResolver() { SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); templateResolver.setCacheable(false); // 加classpath前缀定位类路径下的模板文件 templateResolver.setPrefix("classpath:/templates/thymeleafPage/"); templateResolver.setSuffix(".html"); templateResolver.setTemplateMode("HTML"); // 优先级高于已有的StringTemplateResolver templateResolver.setOrder(1); return templateResolver; } @Bean public ThymeleafViewResolver thymeleafViewResolver() { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine); // 优先级设置为最高,比现有Tiles、JSP解析器的order值更小 resolver.setOrder(0); resolver.setCharacterEncoding("UTF-8"); // 可选配置:指定只解析特定规则的视图,避免和其他解析器冲突 // resolver.setViewNames(new String[]{"th_*"}); return resolver; } @PostConstruct public void configureTemplateEngine() { // 追加模板解析器,不覆盖原有StringTemplateResolver templateEngine.addTemplateResolver(htmlTemplateResolver()); } }
2. 简化原有控制器代码
删除Controller中@PostConstruct的相关配置,保持控制器业务逻辑即可:
@Controller @RequestMapping("/thymeleafConfiguration") public class ConfigController { @RequestMapping(value = "/view") public String viewTemplate(){ return "thymeleaf"; } }
3. 验证配置生效
- 确认templates目录放在类路径根目录下,Maven项目对应
src/main/resources目录,编译后会被打包到WEB-INF/classes下 - 确认原有Tiles、JSP视图解析器的order值大于0,保证Thymeleaf解析优先级符合预期
- 访问路径添加后缀:
http://你的域名/项目上下文/thymeleafConfiguration/view.html即可正常加载Thymeleaf页面
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

