Spring Boot控制器无法渲染Thymeleaf页面,仅返回字符串求助
嘿,我一眼就看到几个关键问题导致你的页面只返回字符串productList而不渲染,咱们一个个来解决:
1. 控制器注解用错了:@RestController vs @Controller
你当前用的@RestController是@Controller和@ResponseBody的组合注解,它的作用是把方法的返回值直接作为HTTP响应体返回(这也是Postman能正常调用API的原因),但这会跳过Spring的视图解析流程,自然不会去加载Thymeleaf页面。
要渲染Thymeleaf视图,你需要把控制器的注解改成@Controller:
@Controller // 替换原来的@RestController @RefreshScope @RequestMapping("/shopping") public class ShoppingController { @RequestMapping(value="/productList") public String listAllProducts(ModelMap model){ logger.info("ShoppingMS : listAllProducts()"); ResponseEntity<List<Product>> responseProductList = prodServ.listAllProducts(); List<Product> products = responseProductList.getBody(); if(products.isEmpty()) { logger.info("No Products Found"); } logger.info("No of products fetched : " +products.size()); model.addAttribute("products", products); return "productList"; // 这里返回的是视图名称,会被视图解析器处理 } }
2. 视图名称与页面文件名不匹配
你的控制器返回的视图名称是productList,但你的Thymeleaf页面文件名叫productsList.html(多了一个's')。Spring Boot默认的Thymeleaf视图解析规则是:
前缀:
classpath:/templates/
后缀:.html
所以返回productList会去找classpath:/templates/productList.html,但你的文件是productsList.html,两者不匹配。解决方法二选一:
- 把控制器的返回值改成
return "productsList"; - 把页面文件名改成
productList.html
3. Thymeleaf模板中的遍历变量错误
你在页面里写的遍历表达式是:
<div class="product-preview-container" th:each="prodInfo : ${products.list}">
但控制器中model.addAttribute("products", products)里的products已经是List<Product>对象了,直接遍历${products}即可,不需要加.list(List本身没有这个属性)。修改后的遍历代码:
<div class="product-preview-container" th:each="prodInfo : ${products}">
另外,你页面里的<a th:href="@{|/buyProduct?code=${prodInfo.code}|}">也要注意,从控制器的实体属性来看,prodInfo的属性是productCode,所以应该改成${prodInfo.productCode},不然会找不到属性报错。
做完以上修改后,再访问http://localhost:1000/shopping/productList,就能正常渲染Thymeleaf页面了!
内容的提问来源于stack exchange,提问作者Som

