我有一个项目,其中来自多个来源的数据被处理成一些数据结构。在程序完成构建这些结构后,我希望它设置一个服务器,使用户能够手动微调这些结构。我决定使用 Spring Boot 设置的嵌入式 Tomcat 服务器上的 Spring MVC 正是我所需要的。
我想使用 Thymeleaf 作为视图技术,因此做了
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Main {
public static void main(String... args) throws Exception {
// Lots of initialization ...
SpringApplication.run(Main.class, args);
}
@Bean
public ServletContextTemplateResolver templateResolver() {
ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
resolver.setPrefix("/resources/views/");
resolver.setSuffix(".html");
resolver.setTemplateMode("HTML5");
resolver.setCacheable(false);
return resolver;
}
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.setTemplateResolver(templateResolver());
return engine;
}
@Bean
public ViewResolver viewResolver() {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine());
viewResolver.setOrder(1);
viewResolver.setViewNames(new String[]{"*"});
viewResolver.setCache(false);
return viewResolver;
}
}
和
@Controller
public class WebController {
@RequestMapping(value="/greeting", method=RequestMethod.GET)
public String greeting() {
return "greeting";
}
}
但是即使在 有一个视图文件/resources/views/greeting.html
,服务器对 URL 的回复http://localhost:8080/greeting
是
org.thymeleaf.exceptions.TemplateInputException: Error resolving template "greeting", template might not exist or might not be accessible by any of the configured Template Resolvers
在调试器中单步执行代码后,似乎在某些时候,ServletContext
应该将视图文件作为流返回,在临时文件夹中看起来像
C:\Users\Michael\AppData\Local\Temp\tomcat-docbase.971027024999448548.8080
这是空的。
现在我知道我需要
在服务器启动时将资源部署到临时文件夹
让服务器在资源所在的目录中运行
我的问题只是我不知道该怎么做,或者哪种方法最好。有些东西告诉我 1 是更好的智慧,但欢迎提出任何建议。
编辑
好的,我最终得到了一些似乎有效的东西。虽然 Joe 的回答确实帮助我上路了,但似乎我不得不以一种让我困惑的方式更改我的 Maven 配置。
将模板greeting.html
放入/resources/templates/greeting.html
并添加resources
到构建路径后,出现错误
javax.servlet.ServletException: Circular view path [greeting]: would dispatch back to the current handler URL [/word/greeting] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
换句话说,Thymeleaf 似乎没有正确配置。经过一番摆弄后,我最终将spring-boot-starter-parent
in的版本pom.xml
从更改0.5.0.BUILD-SNAPSHOT
为0.5.0.M6
:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<!--<version>0.5.0.BUILD-SNAPSHOT</version>-->
<version>0.5.0.M6</version>
</parent>
并从 Thymeleaf 依赖项中删除版本标签
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring3</artifactId>
<!--<version>${thymeleaf-spring3-version}</version>-->
</dependency>
</dependencies>
在此之后,它起作用了。
有人可以解释为什么我需要更改版本spring-boot-starter-parent
才能从中删除版本标签thymeleaf-spring3
,以及为什么有必要这样做?