那么如何为我的springboot webapp设置Thymeleaf模板解析器呢

时间:2016-03-15 16:37:06

标签: maven spring-mvc spring-boot thymeleaf

我在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>

启用调试日志记录级别后,我会看到有关百万美元配置的信息,这与我使用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

2 个答案:

答案 0 :(得分:1)

我很伤心地说,你实际上是做错了。

您已将构建配置为从包中排除Web应用服务器。

<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包的日志级别,以查看模板解析器如何尝试查找模板。

此致 丹尼尔

答案 1 :(得分:0)

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

那些是:

  • 删除<packaking>war</packaging>,以便生成jar;
  • 从依赖项 spring-boot-starter-tomcat 中删除<scope>provided</scope>;
  • 从我的extends SpringBootServletInitializer课程中移除Application;

我不喜欢这个解决方案,因为根据我所遵循的the documentation,你可以使战争可以部署,也可以独立启用。但它现在必须做。