控制器类找不到 html 模板
Posted
技术标签:
【中文标题】控制器类找不到 html 模板【英文标题】:Controller class cannot find html template 【发布时间】:2019-07-04 07:19:15 【问题描述】:My directory
我正在尝试为学校创建 Spring Boot 应用程序,该应用程序使用控制器将书籍从数据库中列出到 html 页面。
我个人认为问题在于控制器由于某种原因找不到模板。因为当我通过 chrome 导航到想要的模板时,它只在页面上显示“书单”,没有别的。
我尝试创建全新的项目并将代码从我的其他文件复制到新文件,但没有结果。
我的控制器类:
@Controller
@ResponseBody
public class BookController
@Autowired
BookRepository bookRepository;
@RequestMapping(value = "/books", method = RequestMethod.GET)
public String getBooks(Model model)
List<Book> books = (List<Book>) bookRepository.findAll();
model.addAttribute("books", books);
return "booklist";
我的html模板:
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Book List</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Books</h1>
<table>
<tr>
<th>Id</th>
<th>Title</th>
<th>Year</th>
<th>Isbn</th>
<th>Price</th>
</tr>
<tr th:each="book : $books">
<td th:text="$book.id">id</td>
<td th:text="$book.title">title</td>
<td th:text="$book.year">year</td>
<td th:text="$book.isbn">isbn</td>
<td th:text="$book.price">price</td>
</tr>
</table>
</body>
</html>
pom.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>hh.swd20</groupId>
<artifactId>Bookstore</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Bookstore</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties 文件:
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.jpa.show-sql=true
【问题讨论】:
如果您想发送 htmlpages,请删除@ResponseBody
请分享您的应用程序的目录结构
在原帖上分享。 @ShubhDixit
你试过 @restcontroller 而不是 controller 吗?你用的是什么链接? 8080/书?
@georgesvan 是的,我有,但它会给出与原始帖子中描述的相同的结果。我正在使用 8080/books 链接
【参考方案1】:
你可以试试这个。
点击:localhost://yourportnumber/api/books
//@Controller
@RestController
//@ResponseBody
@RequestMapping("/api")
public class BookController
@Autowired
BookRepository bookRepository;
@GetMapping(value = "/books", method = RequestMethod.GET)
public ModelAndView getBooks(Model model)
List<Book> books = (List<Book>) bookRepository.findAll();
model.addAttribute("books", books);
ModelAndView mav = new ModelAndView("booklist");
return mav;
【讨论】:
白标错误页面。此应用程序没有显式映射 /error,因此您将其视为后备。出现意外错误(类型=未找到,状态=404)。没有可用的消息 对不起。但实际上 @RestController 包括 @ResponseBody 这对于将 REST 响应作为直接主体提供服务很有用。但是 Roni 的 MVC 方法使用 String 和简单的 @Controller 没有 @ResponseBody 更干净。 是的 @Controller 应该没问题。请尝试我的更新答案。【参考方案2】:从你的控制器类中移除注解@ResponseBody,因为:
@ResponseBody 注解告诉控制器返回的对象会自动序列化为 JSON 并传回 HttpResponse 对象。
然后返回的字符串booklist
将被Spring-MVC用来解析命名的HTML模板文件。
默认在默认模板目录是src/main/resources/templates
中查找模板文件(例如booklist.html
)。
否则请确保拥有configured the ViewResolver properly。
对于 Thymeleaf,您必须将依赖项添加到您的 Maven POM:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
另见this Spring-Boot & Thymeleaf tutorial
【讨论】:
我做到了,但后来我得到了 whitelabel 错误页面,上面写着“此应用程序没有 /error 的显式映射,因此您将其视为后备。” @Roni 感谢更新和目录结构。看起来不错。你的 pom.xml 中的 Thymeleaf 怎么样?您的 BookstoreApplication 类是如何配置/注释的(包括 application.properties)?显示的其他模板是否有效? 我会将它们添加到原始帖子中,谢谢!不幸的是,其他模板都不起作用。 @Roni 现在很明显感谢您的 POM 和其他模板也失败了。添加依赖项(请参阅我的答案),ViewResolver 会自动配置为查找您的模板。 天哪,非常感谢!它终于奏效了!我与这个问题斗争了好几个小时!以上是关于控制器类找不到 html 模板的主要内容,如果未能解决你的问题,请参考以下文章