我有一个非常简单的带有freemarker的webflux演示应用程序,该应用程序具有以下文件:
1.WebFluxDemoApplication.java
@SpringBootApplication
public class WebFluxDemoApplication {
public static void main(String[] args) {
SpringApplication.run(WebFluxDemoApplication.class, args);
}
@Controller
class HomeController {
@GetMapping("/hello")
public String hello() {
return "index";
}
}
}
2.index.ftl (位于类路径:/ templates下)
<html>
<head>
<title>demo</title>
</head>
<body></body>
</html>
3.application.yml (无任何配置)
4.pom.xml (带有spring-boot-starter-freemarker
和spring-boot-starter-webflux
)
我可以使用这些文件通过http://localhost:8080/hello
来获得正常页面,但是如果我将@EnableWebFlux
添加到WebFluxDemoApplication
,则会出现错误,显示 java.lang.IllegalStateException: Could not resolve view with name 'index'.
我注意到Spring WebFlux's official guide声明使用@EnableWebFlux
来配置freemarker。实际上,它适用于模板文件,但是静态资源似乎有问题。
例如,我将main.js
文件放在classpath:/templates/js/
下,并在<script src="/js/main.js"></script>
中添加index.ftl
,然后我得到一个错误,提示 WARN 3046 --- [ctor-http-nio-2] .a.w.r.e.DefaultErrorWebExceptionHandler : Failed to handle request [GET http://localhost:8080/js/main.js]: Response status 404 with reason "No matching handler"
更新
对于静态资源问题,我找到了一种解决方案,该解决方案是添加post所述的RouterFunction
来解析静态资源。
答案 0 :(得分:1)
如the Spring Boot reference documentation, @EnableWebFlux
will tell Spring Boot that you wish to take full control over the WebFlux configuration中所述,并为此禁用所有自动配置(包括静态资源)。
@EnableWebFlux
并没有配置Freemarker,而是实际上设置了整个WebFlux基础结构。对于Spring Boot,只需添加spring-boot-starter-freemarker
作为依赖项(并可以选择通过配置属性对其进行配置)。