spring - 部署在 docker 上时 Spring Boot 找不到模板
问题描述
如果我使用
mvn spring-boot:run
但是当我在 docker 上部署它时,它不起作用,并且出现此错误:
严重:servlet [dispatcherServlet] 的 Servlet.service() 在路径 [] 的上下文中抛出异常 [请求处理失败;嵌套异常是 org.thymeleaf.exceptions.TemplateInputException:解析模板“/store/index”时出错,模板可能不存在或可能无法被任何已配置的模板解析器访问] 根本原因是 org.thymeleaf.exceptions.TemplateInputException:错误解析模板“/store/index”,模板可能不存在或可能无法被任何配置的模板解析器访问
但是如果我继续访问由 spring security 控制的 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 不会使用双斜杠加载视图。我必须在我返回 ModelAndView 的每个地方以及我的 html 文件上的 th:insert 标记处删除 url 开头的斜杠字符。
这个链接对我帮助很大: spring-boot-thymeleaf-not-resolving-fragments-after-packaging
解决方案
始终首先使用“java -jar your_app_name.jar”命令检查应用程序执行情况!一般来说,这个问题主要通过检查以下 3 点来解决 -
- 你的 application.properties 应该有 entry- spring.thymeleaf.prefix=classpath:/templates/
- 您的控制器应返回模板的名称,而无需任何前面的斜杠。由于 thymeleaf 配置区分大小写。
- 你的项目应该遵循标准的 spring boot thymeleaf 目录结构。如果不是,则在您的 application.properties 文件中进行相应的更改。
推荐阅读
- google-apps-script - Google 脚本:使用 IMPORTDATA 公式更新单个单元格
- arrays - 删除 [String:[NSNumber]] 中匹配数字的键
- ssis - SSIS ADO.net 使用事务失败
- nginx - 如何为已安装的 OpenResty 添加对“secure_link”的支持?
- windows - 使用 Terraform 和启动脚本创建专用网络 - Google Cloud Platform
- laravel - 如何在 laravel 中为 SPA 管理面板注册路由
- wpf - 如何禁用 WebBrowser 控制的密码管理器
- python - 如何将毫秒转换为时间
- javascript - 如何使用 javascript 或 typescript 在新窗口中打开页面?
- facebook - Facebook 评级 API 未返回评论者姓名