Spring Boot在Docker上部署时找不到模板

时间:2018-09-01 18:12:55

标签: spring docker spring-boot thymeleaf

如果我使用

在主机上运行应用程序,则我的应用程序可以正常运行
mvn spring-boot:run

但是当我在docker上部署它时,它不起作用,并且出现此错误:

  

严重:路径为[]的Servlet [dispatcherServlet]的Servlet.service()抛出异常[请求处理失败;嵌套的异常是org.thymeleaf.exceptions.TemplateInputException:解决模板“ / store / index”时出错,模板可能不存在,或者任何配置的模板解析器都无法访问该模板],其根本原因是org.thymeleaf.exceptions.TemplateInputException:错误解析模板“ / store / index”,则该模板可能不存在,或者任何已配置的模板解析器都无法访问该模板

但是,如果我输入受Spring安全性控制的URL:http:localhost:8080 / login,则会正常呈现模板。似乎是权限问题,但我不确定。

这是我的Dockerfile:

FROM openjdk
VOLUME /tmp
RUN touch engdevcommerce.jar
COPY target/engdevcommerce.jar engdevcommerce.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/engdevcommerce.jar"]

解决方案: 原来我遇到的问题与docker部署无关。我在主机上运行了jar文件,但遇到了同样的错误。 问题是,在控制器方法中返回视图URL的地方,我从这样的斜杠开始:“ / ... / ...”。当应用程序打包为.jar文件时,spring不会以双斜杠加载视图。我必须在URL开头的每一个我返回ModelAndView的位置以及在HTML文件上的th:insert标签处都删除斜杠字符。

此链接对我有很大帮助: spring-boot-thymeleaf-not-resolving-fragments-after-packaging

2 个答案:

答案 0 :(得分:0)

将本地index目录添加到dockerfile中,这样它将创建/store并将index目录复制到/store中,那么您的docker vm将具有/store/index您本地index目录中的内容

 ...
 ...
 ADD <local-index-directory> /store
 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","- 
 jar","/engdevcommerce.jar"]

答案 1 :(得分:0)

始终首先使用“ java -jar your_app_name.jar”命令检查应用程序执行情况! 通常,通过检查以下3点,可以很大程度上解决此问题-

  1. 您的application.properties应该具有以下条目: spring.thymeleaf.prefix = classpath:/ templates /
  2. 您的控制器应返回模板名称,且前面没有任何斜杠。由于百里香叶的配置区分大小写。
  3. 您的项目应遵循标准的s [romg boot thymeleaf目录结构。如果没有,那么请在application.properties文件中进行相应的更改。