【问题标题】:So how do I set a Thymeleaf template resolver for my springboot webapp then那么如何为我的springboot webapp设置一个Thymeleaf模板解析器
【发布时间】:2016-07-01 05:38:21
【问题描述】:

我在 src/main/resources/template 下构建了一个带有单个 home.html 文件的 spring-boot webapp,当我从我的 spring 控制器返回“home”时,它运行良好。我将它打包成一场战争,它与 spring-boot 的嵌入式 tomcat 服务器运行得非常好。如果我用mvn spring-boot:run 运行它,那就是。

但是后来如果我用java -jar myjar.war 启动我的应用程序,它声称服务器已经启动并且一切正常,但是当我尝试在 localhost:8080 访问它时它失败了:

Error resolving template "home", template might not exist or might not be accessible by any of the configured Template Resolvers

那我接下来该怎么办?

这是我的 pom.xml,顺便说一句:

  <groupId>com.ciber</groupId>
  <artifactId>energyworx-conversion-tool</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.3.RELEASE</version>
    </parent>

  <properties>
    <java.version>1.7</java.version>    
    <start-class>com.ciber.ewct.WebApp</start-class>
  </properties>

  <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>            
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
  </dependencies>
  <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>          
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
                <compilerArgument>-Xlint:all</compilerArgument>
                <showWarnings>true</showWarnings>
                <showDeprecation>true</showDeprecation>
            </configuration>
        </plugin> 
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <fork>true</fork>
                <!-- <jvmArguments>-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000</jvmArguments> -->
            </configuration>
        </plugin>
    </plugins>
  </build>

打开调试日志记录级别后,我看到了有关 thymeleaf 配置的信息,当我使用 mvn spring-boot:runjava -jar 运行它时也是如此:

[THYMELEAF] * Cache Factory implementation: org.thymeleaf.cache.StandardCacheManager
[THYMELEAF] * Template modes:
[THYMELEAF]     * LEGACYHTML5
[THYMELEAF]     * XHTML
[THYMELEAF]     * HTML5
[THYMELEAF]     * VALIDXML
[THYMELEAF]     * VALIDXHTML
[THYMELEAF]     * XML
[THYMELEAF] * Template resolvers (in order):
[THYMELEAF]     * org.thymeleaf.templateresolver.TemplateResolver
[THYMELEAF] * Message resolvers (in order):
[THYMELEAF]     * org.thymeleaf.spring4.messageresolver.SpringMessageResolver
[THYMELEAF] * Dialect [1 of 2]: org.thymeleaf.spring4.dialect.SpringStandardDialect
[THYMELEAF]     * Prefix: "th"
[THYMELEAF] * Dialect [2 of 2]: nz.net.ultraq.thymeleaf.LayoutDialect
[THYMELEAF]     * Prefix: "layout"
[THYMELEAF] TEMPLATE ENGINE CONFIGURED OK

【问题讨论】:

  • 您是如何配置 Thymeleaf 解析器的?使用 spring-boot-starter-thymeleaf ?
  • 我没有配置。我只将依赖项添加到我的 pom 中: org.springframework.bootspring-boot-starter-thymeleaf
  • 尝试打开打包的war文件并检查模板/home.html是否存在于存档中。您提到您正在打包为战争文件,但我在您的 pom 中没有看到任何关于此打包的说明。默认情况下,你应该有一个罐子,而不是一个战争。会不会是您正在尝试执行旧工件?
  • 它被打包为战争,我已经编辑了问题以包含 pom.xml 的那部分。
  • 我可以在目标文件夹中看到war文件。这不是旧的。当我运行 mvn clean package 时会生成一个新的。

标签: maven spring-mvc spring-boot thymeleaf


【解决方案1】:

我很遗憾地说你实际上做错了。

您已将构建配置为从您的包中排除 webapp 服务器。

<packaking>war</packaging>
...
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

通过此设置,您可以在现有的 Servlet 容器中部署一个战争。您将无法使用 java -jar 命令启动您的应用。

如果你想用 java 命令行运行你的 webapp。将您的包装替换为 jar 并从您的 pom 中删除 provided 指令。

<packaking>jar</packaging>
...
<!--
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-tomcat</artifactId>
   <scope>provided</scope>
</dependency>
-->

然后您的 jar 中将嵌入一个 tomcat,并且命令 java -jar myjar.jar 将正常运行。

编辑:最后,我会提高 Spring Web 包的日志级别,以查看模板解析器如何尝试查找您的模板。

问候, 丹尼尔

【讨论】:

  • 我阅读的文档说,通过这样打包,tomcat jars 将进入 lib-provided 文件夹,并使战争既可部署又能够独立运行。
  • 我尝试了您的建议,但仍然无法正常工作。我注释掉了依赖和战争包装。将其重新打包为jar。还是同样的问题。当我启动应用程序时,spring-boot 声称一切都已启动且没有错误。它真的只是因为某种原因找不到home.html。
  • 最后一件事,你确定Error resolving template "home" ... 消息是根本原因吗?在此之前你没有任何例外吗?当视图解析器在执行模板时遇到错误时,您将获得错误的堆栈跟踪,然后 Spring 视图解析器仍然尝试解析模板,因此失败。
  • 最后,我将提高 Spring Web 包的日志级别,以查看模板解析器如何尝试查找您的模板。
  • 我已经编辑了问题,以包括打开调试后看到的 thymeleaf 配置条目。
【解决方案2】:

在@DanielLavoie 的帮助下,我似乎已经修复了它,恢复了我为使应用程序成为可部署的战争所做的所有更改。

那些是:

  • 删除&lt;packaking&gt;war&lt;/packaging&gt; 以便生成一个jar;
  • 从依赖项spring-boot-starter-tomcat中移除&lt;scope&gt;provided&lt;/scope&gt;
  • 从我的Application 类中删除extends SpringBootServletInitializer

我不喜欢这个解决方案,因为根据the documentation 我跟着你可以使战争可部署并且也可以独立启用。但现在必须这样做。

【讨论】:

  • 感觉你不明白进行可部署战争意味着什么。进行可部署的战争意味着您只能将其上传到 servlet 容器。你不能让战争既可运行又可部署。
  • 那么他们不应该在他们的文档中这样写。
猜你喜欢
  • 1970-01-01
  • 2017-05-10
  • 2021-11-05
  • 2016-01-27
  • 2016-01-30
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
  • 2017-12-09
相关资源
最近更新 更多