为啥我无法使用 Spring Boot 应用程序启动 Thymeleaf 模板?
Posted
技术标签:
【中文标题】为啥我无法使用 Spring Boot 应用程序启动 Thymeleaf 模板?【英文标题】:Why i am unable to launch Thymeleaf Template with springboot application?为什么我无法使用 Spring Boot 应用程序启动 Thymeleaf 模板? 【发布时间】:2020-11-16 04:58:28 【问题描述】:我正在使用 IntelliJ IDEA 社区版 2020.1.2 x64 并使用 Spring DataJPA 和 Thymeleaf 编写程序,我的代码没有问题,我没有收到错误,但是当我传递我在控制器类中映射的 URL 时我无法得到想要的结果,即我创建的百里香模板没有显示在浏览器上。
我在浏览器上发布控制器类、thymeleaf 模板和输出以使您清楚:-
控制器类:
@RestController
@RequestMapping("/ecommerce")
public class EmployeeController
@Autowired
private ProductService productService;
@GetMapping("/available")
public String ShowAllProducts(Model model)
model.addAttribute("listProducts",productService.getAllProducts());
return "availableProducts";
Thymeleaf 模板:-
<!DOCTYPE html>
<html xmlns:th="html://thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>AvailableProducts</title>
</head>
<body>
<div align="center">
<h1>Product List</h1>
<table>
<thead>
<tr>
<th>p_id</th>
<th>ProductName</th>
<th>Productcost</th>
<th>QuantityAvailable</th>
</tr>
</thead>
<tbody>
<tr th:each="product : $listProducts">
<td th:text="$product.productId"></td>
<td th:text="$product.productName"></td>
<td th:text="$product.productCost"></td>
<td th:text="$product.quanityAvailable"></td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
在浏览器上的输出:-
添加依赖:-
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
application.properties:-
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/ecommerce
spring.datasource.username=root
spring.datasource.password=deep
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto= update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.thymeleaf.prefix=classpath*:/templates/
spring.thymeleaf.check-template-location=true
spring.thymeleaf.suffix=.html
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html
spring.thymeleaf.mode=HTML5
最后,当我传递 url http://hocalhost:8080/ecommerce/available
时,我在控制台中看到的是,hibernate 每次都在访问数据库。
提前谢谢.. 请帮助我被卡住了,不知道我做错了什么并且无法自己弄清楚..
【问题讨论】:
【参考方案1】:在您的情况下,控制器似乎只是返回字符串“availableProducts”并且它没有解析为 thymleaf 模板。您可以只返回一些虚拟名称(“availableProductsTest”),然后您会在网页上看到相同的名称(availableProductsTest)。
您是否参考了示例https://spring.io/guides/gs/serving-web-content/
示例代码可在此处获得 .. git clone https://github.com/spring-guides/gs-serving-web-content.git
如果您只是添加您的产品类并像下面这样修改问候语控制器,那么您可以看到它的工作!
@GetMapping("/greeting")
public String greeting(@RequestParam(name="name", required=false, defaultValue="World") String name, Model model)
model.addAttribute("name", name);
List<Products> productList= new ArrayList<>();
Products product = new Products("productId","ProductName", "ProductCost", "ProductQtyAvlb");
productList.add(product);
model.addAttribute("listProducts",productList);
return "greeting";
同时修改问候模板如下
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Getting Started: Serving Web Content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'Hello, ' + $name + '!'" />
<div align="center">
<h1>Product List</h1>
<table>
<thead>
<tr>
<th>p_id</th>
<th>ProductName</th>
<th>Productcost</th>
<th>QuantityAvailable</th>
</tr>
</thead>
<tbody>
<tr th:each="product : $listProducts">
<td th:text="$product.productId"></td>
<td th:text="$product.productName"></td>
<td th:text="$product.productCost"></td>
<td th:text="$product.quanityAvailable"></td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
希望这会有所帮助!快乐编码
网页参考:https://spring.io/guides/gs/serving-web-content/
每当您获得 Whitelabel 错误页面时,您都会在同一页面上列出有关错误的详细信息,并且可以在服务器日志或应用程序控制台中看到相同的详细信息。
例如,如果我在控制器中使用了错误的模板名称,那么我会看到以下内容:
2020-07-28 22:35:51.031 错误 19572 --- [nio-8080-exec-1] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-8080-exec-1] 异常处理模板“greeting1” : 解析模板 [greeting1] 时出错,模板可能不存在或可能无法被任何已配置的模板解析器访问
org.thymeleaf.exceptions.TemplateInputException:解析模板时出错 [greeting1],模板可能不存在或可能无法被任何已配置的模板解析器访问 在 org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] 在 org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] 在 org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE] 在 org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
【讨论】:
如果我们从`modal.addAttribute()`中删除productService.getAllProducts()
,我将从MySql数据库中获取数据它将如何工作..
这里的重点不是删除 productService.getAllProducts() 但仍从您的数据库中读取。但在您的代码中,控制器似乎只是返回一个字符串而不是一个模板。我分享的示例代码是一个独立的应用程序,用于查看 thymleaf 是如何通过控制器返回的。请尝试运行示例,看看您的代码有什么不同,因为哪些代码不起作用。
@Prograammer 我收到 whitelabel 错误页面,我已将 html 文件放在模板文件夹中。
每当您获得 Whitelabel 错误页面时,您都会在同一页面上列出有关错误的详细信息,并且可以在服务器日志或应用程序控制台中看到相同的详细信息。例如,如果我在控制器中使用了错误的模板名称,那么我会看到上面修改后的答案:以上是关于为啥我无法使用 Spring Boot 应用程序启动 Thymeleaf 模板?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 spring-boot 应用程序无法在 AWS 中运行,但在本地运行良好?
为啥 Spring MVC 4 和 Hystrix 集成在没有 Spring boot API 的情况下无法工作?
为啥我登录后无法进入管理 REST API 请求映射 - Spring Boot
Spring Boot 定时任务,怎么实现任务动态增删启停?
为啥添加 @EnableAutoConfiguration 会导致 spring-boot 失败并显示“无法找到要扫描的 JPA 包”