28.2.1 Spring WebFlux自动配置
Spring Boot为Spring WebFlux提供自动配置,适用于大多数应用程序。
自动配置在Spring的默认值之上添加了以下功能:
为 HttpMessageReader 和 HttpMessageWriter 实例配置编解码器( 本文档后面会介绍)。
支持提供静态资源,包括对WebJars的支持( 本文档后面将介绍)。
如果你想保留Spring Boot WebFlux功能,并且想要添加额外的 WebFlux配置,你可以添加自己的 @Configuration 类 WebFluxConfigurer
但没有 @EnableWebFlux 。
如果您想完全控制Spring WebFlux,可以使用 @EnableWebFlux 添加自己的 @Configuration 注释。
28.2.2带有HttpMessageReaders和HttpMessageWriters的HTTP编解码器
Spring WebFlux使用 HttpMessageReader 和 HttpMessageWriter 接口转换HTTP请求和响应。通过查看类路径中可用的库,它们配置
为 CodecConfigurer 以具有合理的默认值。
Spring Boot通过使用 CodecCustomizer 实例进一步自定义。例如, spring.jackson.* 配置密钥应用于Jackson编解码器。
如果需要添加或自定义编解码器,可以创建自定义 CodecCustomizer 组件,如以下示例所示:
import org.springframework.boot.web.codec.CodecCustomizer;
@Configuration
public class MyConfiguration {
@Bean
public CodecCustomizer myCodecCustomizer() {
return codecConfigurer -> {
// ...
}
}
}
您还可以利用Boot的自定义JSON序列化程序和反序列化程序。
28.2.3静态内容
默认情况下,Spring Boot从类路径中名为 /static (或 /public 或 /resources 或 /META-INF/resources )的目录中提供静态内容。它使用
来自Spring WebFlux的 ResourceWebHandler ,以便您可以通过添加自己的 WebFluxConfigurer 并覆盖 addResourceHandlers 方法来修改
该行为。
默认情况下,资源映射到 /** ,但您可以通过设置 spring.webflux.static-path-pattern 属性来调整它。例如,将所有资源重新定位
到 /resources/** 可以实现如下:
spring.webflux.static-path-pattern=/resources/**
您还可以使用 spring.resources.static-locations 自定义静态资源位置。这样做会将默认值替换为目录位置列表。如果这样做,默认的欢
迎页面检测会切换到您的自定义位置。因此,如果您在启动时的任何位置都有 index.html ,那么它就是应用程序的主页。
除了前面列出的“标准”静态资源位置之外,还为Webjars内容制作了一个特例。如果文件以Webjars格式打包,那么具有 /webjars/** 中路径
的任何资源都将从jar文件中提供。
Spring WebFlux应用程序并不严格依赖于Servlet API,因此它们不能作为war文件部署,也不能使用 src/main/webapp 目录。
28.2.4模板引擎
除REST Web服务外,您还可以使用Spring WebFlux来提供动态HTML内容。Spring WebFlux支持各种模板技术,包括Thymeleaf,
FreeMarker和Mustache。
Spring Boot包括对以下模板引擎的自动配置支持:
FreeMarker的
Thymeleaf
胡子
当您使用其中一个模板引擎和默认配置时,您的模板将从 src/main/resources/templates 自动获取。
28.2.5错误处理
Spring Boot提供 WebExceptionHandler 以合理的方式处理所有错误。它在处理顺序中的位置紧接在WebFlux提供的处理程序之前,这被认为
是最后的。对于计算机客户端,它会生成一个JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。对于浏览器客户端,有一
个“whitelabel”错误处理程序,它以HTML格式呈现相同的数据。您还可以提供自己的HTML模板来显示错误(请参阅 下一节)。
自定义此功能的第一步通常涉及使用现有机制,但替换或扩充错误内容。为此,您可以添加bean类型 ErrorAttributes 。
要更改错误处理行为,您可以实现 ErrorWebExceptionHandler 并注册该类型的bean定义。因为 WebExceptionHandler 非常低级,Spring
Boot还提供了一个方便的 AbstractErrorWebExceptionHandler 来让你以WebFlux函数方式处理错误,如下例所示:
public class CustomErrorWebExceptionHandler extends AbstractErrorWebExceptionHandler {
// Define constructor here
@Override
protected RouterFunction<ServerResponse> getRoutingFunction(ErrorAttributes errorAttributes) {
return RouterFunctions
.route(aPredicate, aHandler)
.andRoute(anotherPredicate, anotherHandler);
}
}
要获得更完整的图片,您还可以直接继承 DefaultErrorWebExceptionHandler 并覆盖特定方法。
自定义错误页面
如果要显示给定状态代码的自定义HTML错误页面,可以将文件添加到 /error 文件夹。错误页面可以是静态HTML(即,添加到任何静态资源
文件夹下)或使用模板构建。文件名应该是确切的状态代码或系列掩码。
例如,要将 404 映射到静态HTML文件,您的文件夹结构将如下所示:
src/
+- main/
+- java/
| + <source code>
+- resources/
+- public/
+- error/
| +- 404.html
+- <other public assets>
要使用Mustache模板映射所有 5xx 错误,您的文件夹结构如下:
src/
+- main/
+- java/
| + <source code>
+- resources/
+- templates/
+- error/
| +- 5xx.mustache
+- <other templates>