Thymeleaf 无法检测到 spring-boot 项目中的模板

Posted

技术标签:

【中文标题】Thymeleaf 无法检测到 spring-boot 项目中的模板【英文标题】:Thymeleaf cannot detect templates inside spring-boot project 【发布时间】:2017-08-14 07:40:23 【问题描述】:

我的 Spring Boot 应用程序中有以下项目结构,我想在其中使用 Thymeleaf

projectName
    -Gradle-Module1(Spring boot module)
        -build
        -src
            -main
            -resources
                -templates
                    index.html
        build.gradle
    -Gradle-Module2
        ...
    build.gradle
    ...

但是 spring-boot 找不到我的模板目录并显示警告

找不到模板位置:classpath:/templates/(请添加一些模板或检查您的 Thymeleaf 配置)

PS:我使用的是@EnableAutoConfiguration

在我的控制器代码中,我正在执行以下操作:

@Controller
@EnableAutoConfiguration
public class BaseController 

    @RequestMapping(value = "/")
    public String index() 
        return "index.html";
    

index.html 文件只打印 hello world。

所以通常它应该在src/resources/templates/(我想是同一个 Gradle 模块的)内部查找,但不知何故它无法找到它。

当我尝试访问 localhost:8080 时出现以下错误

解析模板“index.html”时出错,模板可能不存在或可能无法被任何已配置的模板解析器访问`

我有什么遗漏吗? 任何指针表示赞赏。谢谢。

【问题讨论】:

这是一个很好的问题。感谢您的提问! 【参考方案1】:

您必须按如下方式配置 Thymeleaf:

@Configuration
public class ThymeleafConfig 
    @Bean
    public SpringResourceTemplateResolver templateResolver() 
        SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
        templateResolver.setCacheable(false);
        templateResolver.setPrefix("classpath:/templates/");
        templateResolver.setSuffix(".html");
        return templateResolver;
    

    @Bean
    public SpringTemplateEngine templateEngine() 
        SpringTemplateEngine springTemplateEngine = new SpringTemplateEngine();
        springTemplateEngine.addTemplateResolver(templateResolver());
        return springTemplateEngine;
    

    @Bean
    public ThymeleafViewResolver viewResolver() 
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine(templateEngine());
        viewResolver.setOrder(1);
        return viewResolver;
    

Spring doc recommends 将@EnableAutoConfiguration 注释添加到您的主要@Configuration 类。

您的项目结构似乎有误,典型的包层次结构是:

src
  |- main
      |- java
      |- resources
          |- static
          |- templates
  |- test

在这种情况下,您的模板将位于 src/main/resources/templates,而不是 src/resources/templates/

【讨论】:

谢谢。行“templateResolver.setPrefix("classpath:/templates/");"在运行带有 jar 包装的 Spring-Boot 时,为我解决了这个问题。 这解决了我的问题。我已经使用 Intellij IDEA 开发,并且我能够以某种方式在没有这种配置的情况下运行 thymeleaf。当我将项目打包到 JAR 并在服务器上运行时,我们注意到了这个问题。花了很多时间才终于找到这个。 我相信,如果您使用的是 spring boot 并且对您的类路径有 spring-boot-starter-thymeleaf 依赖(例如,如果使用 maven,则在您的 pom.xml 中),您不需要显式连接一个 ViewResolver。【参考方案2】:

您应该只返回文件名。例如,没有 .hmtl

@RequestMapping(value = "/")
   public String index() 
   return "index";

【讨论】:

试过但面临问题Wed Mar 22 15:33:08 IST 2017 There was an unexpected error (type=Internal Server Error, status=500). Error resolving template "index", template might not exist or might not be accessible by any of the configured Template Resolvers 请为 requestmapping 和 index.html 文件发布您的课程,以便我们了解更多上下文。您是否使用任何形式的身份验证? 能否请您为您的 questmappin 和 index.html 文件发布课程?如果你有一个更大的堆栈跟踪,那会很有帮助。你只用return "index";修改了你的帖子 我已经添加了Controller类,我目前正在尝试学习React + Spring boot,所以没有太多代码,而且我的index.html只包含一个像Hello world这样的打印语句【参考方案3】:
@GetMapping("/")
public String index() 
    return "index";

【讨论】:

以上是关于Thymeleaf 无法检测到 spring-boot 项目中的模板的主要内容,如果未能解决你的问题,请参考以下文章

Thymeleaf - 我无法使用 Link th:href 将两个值从 HTML 传递到控制器

Thymeleaf-Spring4 无法自动装配 TemplateEngine

Thymeleaf (Java Spring):无法让 mvc.uri 工作

Spring MVC + thymeleaf + html 在页面上无法获取session的值

无法解析来自thymeleaf的javascript中的JSON对象

Thymeleaf和Spring安全无法正常工作[重复]