为啥我无法使用 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 Dubbo 应用启停源码分析

Spring Boot 定时任务,怎么实现任务动态增删启停?

为啥添加 @EnableAutoConfiguration 会导致 spring-boot 失败并显示“无法找到要扫描的 JPA 包”