使用在.jar中打包的Thymeleaf使用Spring Boot解析模板时出错

时间:2018-01-23 11:46:41

标签: spring-mvc spring-boot thymeleaf

我有一个使用Thymeleaf作为模板解析器的Spring Boot应用程序,在从NetBeans调试时工作正常,但是在运行其.jar时出现此错误:

解析模板“/ theme / property”时出错,模板可能不存在,或者任何已配置的模板解析器都无法访问

应用程序设置为自动配置程序,注释为@SpringBootApplication,扩展名为SpringBootServletInitializer。我没有在属性文件中设置任何contextPath。我正在使用Thymeleaf 2.1.6和Spring 4版本。 jar是用Maven生成的。

做了一些研究我发现在某些控制器中我传递了一个双斜线,我已经解决了,但大多数页面仍无效。

此控制器有效:

@GetMapping("/{idweb}")
String frontEndHome(@PathVariable("idweb")Integer idweb, Model model){
...
return "theme/home";

将return语句设置为 return“/ theme / home”; 不起作用。我猜,因为模板解析器正在收到双斜杠(//).

此其他控制器引发错误:

@GetMapping("/{idweb}/property")
String frontEndProperty(@PathVariable("idweb") Integer idweb, @RequestParam(value = "idproperty", required = false) Integer idproperty, Model model) throws Exception {
...
return "theme/property";

索引控制器也能正常工作:

@GetMapping("/")
public String index(Model model){
   ...
   return "index";
}

这是我的应用程序入门级:

@SpringBootApplication
public class RentalWebsApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder  application) {
       return application.sources(RentalWebsApplication.class);
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(RentalWebsApplication.class, args);
    }
}

对于Thymeleaf我没有设置任何配置,虽然我已经测试了应用程序将其设置到application.properties文件中,结果相同:

spring.thymeleaf.prefix=classpath:/templates/

所有html文件都设置为:

src/main/resources/templates

示例中的html文件位于:

src/main/resources/templates/index.html

src/main/resources/templates/theme/home.html

src/main/resources/templates/theme/property.html

还有一些其他问题涉及同一问题,但没有一个问题对我有用。任何帮助,将不胜感激。

更新

将jar部署到Pivotal Web Services中,整个网站运行良好,但没有使用Boxfuse,Heroku或在本地运行jar。因此,我猜问题的根源是一些错误的配置,Pivotal系统检测并纠正。*

* PWS未纠正配置问题。它在运行应用程序之前解压缩你的jar文件,这会阻止双斜杠导致问题。 - Andy Wilkinson

3 个答案:

答案 0 :(得分:5)

最后,解决方案与双斜杠相关,如果我们在开头设置带斜杠的return语句,classpath:/templates/会得到:

return "/theme/property"

而不是:

return "theme/property"

在我的情况下,问题不是在控制器上,而是在带有Thymeleaf片段引用的html中,就像在这个例子中一样:

<footer th:replace="/index::footer"></footer>

而不是:

<footer th:replace="index::footer"></footer>

我不明白为什么IDE(NetBeans和STS)不会引起错误。

答案 1 :(得分:0)

从application.properties中删除spring.thymeleaf.prefix = classpath:/ templates /。

答案 2 :(得分:0)

使用

' joined DataTable columns
Dim JoinedDT As New DataTable
JoinedDT.Columns.Add("ID", GetType(Integer))
JoinedDT.Columns.Add("Name", GetType(String))
JoinedDT.Columns.Add("YearOfBirth", GetType(Integer))

' other stuff

Dim query As IEnumerable(Of DataRow) = (From dr1 In Dt1.AsEnumerable() _
                                       Group Join dr2 In Dt2.AsEnumerable() _
                                       On dr1.Field(Of Integer)("ID") Equals dr2.Field(Of Integer)("ID") _
                                       Into joined = Group _
                                       From j In joined.DefaultIfEmpty() _
                                       Select New With
                                       {
                                           .ID = dr1.Field(Of Integer)("ID"),
                                           .Name = dr1.Field(Of String)("Name"),
                                           .YearOfBirth = If(j IsNot Nothing, j.Field(Of Integer)("YearOfBirth"), 0)
                                       }).Select(Function(r)
                                           ' use `DataTable.NewRow` here
                                           Dim row As DataRow = JoinedDT.NewRow()
                                           row("ID") = r.ID
                                           row("Name") = r.Name
                                           row("YearOfBirth") = r.YearOfBirth
                                           Return row
                                       End Function)

Dt3 = query.CopyToDataTable()

而不是

public int countPixels(Colour colour) {
    int count = 0;
    //Colour c1 = Colour.WHITE.getTexture();
    //Colour c2 = Colour.BLACK.getTexture();
    return count;
}

enter image description here