You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

现有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:27:05