对于最新的稳定版本,请使用 Spring Framework 6.2.0! |
WebFlux 配置
WebFlux Java 配置声明了处理
请求,并且它提供了一个 API 来
自定义配置。这意味着您不需要了解底层
由 Java 配置创建的 bean。但是,如果您想了解它们,
您可以在 Views them in 或 read more about them are
在 Special Bean Types 中。WebFluxConfigurationSupport
对于配置 API 中不可用的更高级自定义,您可以 通过高级配置模式获得对配置的完全控制。
启用 WebFlux 配置
您可以在 Java 配置中使用 Comments,如下例所示:@EnableWebFlux
-
Java
-
Kotlin
@Configuration
@EnableWebFlux
public class WebConfig {
}
@Configuration
@EnableWebFlux
class WebConfig
前面的示例注册了许多 Spring WebFlux 基础结构 bean 并适应依赖项 available on the classpath — 用于 JSON、XML 等。
WebFlux 配置 API
在 Java 配置中,您可以实现接口
如下例所示:WebFluxConfigurer
-
Java
-
Kotlin
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
// Implement configuration methods...
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
// Implement configuration methods...
}
转换, 格式设置
默认情况下,会安装各种数字和日期类型的格式化程序,以及支持
用于自定义 via 和 on 字段和参数。@NumberFormat
@DateTimeFormat
要在 Java 配置中注册自定义格式化程序和转换器,请使用以下内容:
-
Java
-
Kotlin
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
// ...
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun addFormatters(registry: FormatterRegistry) {
// ...
}
}
默认情况下,Spring WebFlux 在解析和格式化日期时会考虑请求 Locale 值。这适用于日期表示为带有 “input” 形式的字符串的表单 领域。但是,对于“日期”和“时间”表单字段,浏览器使用定义的固定格式 在 HTML 规范中。对于此类情况,可以按如下方式自定义日期和时间格式:
-
Java
-
Kotlin
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
registrar.setUseIsoFormat(true);
registrar.registerFormatters(registry);
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun addFormatters(registry: FormatterRegistry) {
val registrar = DateTimeFormatterRegistrar()
registrar.setUseIsoFormat(true)
registrar.registerFormatters(registry)
}
}
请参阅 FormatterRegistrar SPI 和有关何时
use 实现。FormattingConversionServiceFactoryBean FormatterRegistrar |
验证
默认情况下,如果存在 Bean Validation
在 Classpath(例如,Hibernate Validator)上,它被注册为全局验证器,以便与方法参数一起使用。LocalValidatorFactoryBean
@Valid
@Validated
@Controller
在 Java 配置中,您可以自定义全局实例
如下例所示:Validator
-
Java
-
Kotlin
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public Validator getValidator() {
// ...
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun getValidator(): Validator {
// ...
}
}
请注意,你也可以在本地注册 implementations,
如下例所示:Validator
-
Java
-
Kotlin
@Controller
public class MyController {
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.addValidators(new FooValidator());
}
}
@Controller
class MyController {
@InitBinder
protected fun initBinder(binder: WebDataBinder) {
binder.addValidators(FooValidator())
}
}
如果你需要在某个地方注入一个 Bean,创建一个 bean 并
将其标记为 ,以避免与 MVC 配置中声明的冲突。LocalValidatorFactoryBean @Primary |
内容类型解析程序
您可以配置 Spring WebFlux 如何确定请求中实例的请求的媒体类型。默认情况下,仅选中标题,
但您也可以启用基于查询参数的策略。@Controller
Accept
以下示例显示如何自定义请求的内容类型解析:
-
Java
-
Kotlin
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureContentTypeResolver(RequestedContentTypeResolverBuilder builder) {
// ...
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun configureContentTypeResolver(builder: RequestedContentTypeResolverBuilder) {
// ...
}
}
HTTP 消息编解码器
以下示例显示如何自定义请求和响应正文的读取和写入方式:
-
Java
-
Kotlin
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
configurer.defaultCodecs().maxInMemorySize(512 * 1024);
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun configureHttpMessageCodecs(configurer: ServerCodecConfigurer) {
configurer.defaultCodecs().maxInMemorySize(512 * 1024)
}
}
ServerCodecConfigurer
提供一组默认读取器和写入器。您可以使用它来添加
更多读取器和写入器,自定义默认读取器和写入器,或完全替换默认读取器和写入器。
对于 Jackson JSON 和 XML,请考虑使用 Jackson2ObjectMapperBuilder
,
,它使用以下属性自定义 Jackson 的默认属性:
如果在 Classpath 中检测到以下众所周知的模块,它还会自动注册它们:
-
jackson-datatype-jsr310
:支持 Java 8 日期和时间 API 类型。 -
jackson-datatype-jdk8
:支持其他 Java 8 类型,例如 .Optional
-
jackson-module-kotlin
:支持 Kotlin 类和数据类。
View 解析程序
以下示例显示如何配置视图分辨率:
-
Java
-
Kotlin
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
// ...
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun configureViewResolvers(registry: ViewResolverRegistry) {
// ...
}
}
具有视图技术的快捷方式,Spring Framework 使用这些
集成。以下示例使用 FreeMarker(还需要配置
基础 FreeMarker 视图技术):ViewResolverRegistry
-
Java
-
Kotlin
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.freeMarker();
}
// Configure Freemarker...
@Bean
public FreeMarkerConfigurer freeMarkerConfigurer() {
FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
configurer.setTemplateLoaderPath("classpath:/templates");
return configurer;
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun configureViewResolvers(registry: ViewResolverRegistry) {
registry.freeMarker()
}
// Configure Freemarker...
@Bean
fun freeMarkerConfigurer() = FreeMarkerConfigurer().apply {
setTemplateLoaderPath("classpath:/templates")
}
}
您还可以插入任何实现,如下例所示:ViewResolver
-
Java
-
Kotlin
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
ViewResolver resolver = ... ;
registry.viewResolver(resolver);
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun configureViewResolvers(registry: ViewResolverRegistry) {
val resolver: ViewResolver = ...
registry.viewResolver(resolver
}
}
支持 Content Negotiation 和呈现其他格式
通过视图分辨率(除了 HTML),您可以配置一个或多个基于
在实现上,它接受来自 .以下示例显示了如何执行此操作:HttpMessageWriterView
spring-web
-
Java
-
Kotlin
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.freeMarker();
Jackson2JsonEncoder encoder = new Jackson2JsonEncoder();
registry.defaultViews(new HttpMessageWriterView(encoder));
}
// ...
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun configureViewResolvers(registry: ViewResolverRegistry) {
registry.freeMarker()
val encoder = Jackson2JsonEncoder()
registry.defaultViews(HttpMessageWriterView(encoder))
}
// ...
}
有关与 Spring WebFlux 集成的视图技术的更多信息,请参见 View Technologies。
静态资源
此选项提供了一种从基于 Resource
的位置列表提供静态资源的便捷方法。
在下一个示例中,给定一个以 开头的请求,相对路径为
用于查找和提供相对于 Classpath 上的静态资源。资源
提供一年的未来到期时间,以确保最大限度地使用浏览器缓存
以及减少浏览器发出的 HTTP 请求。标头也是
已评估,如果存在,则返回状态代码。以下清单显示了
示例:/resources
/static
Last-Modified
304
-
Java
-
Kotlin
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public", "classpath:/static/")
.setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS));
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public", "classpath:/static/")
.setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS))
}
}
另请参阅静态资源的 HTTP 缓存支持。
资源处理程序还支持一系列 ResourceResolver
实现和 ResourceTransformer
实现。
可用于创建用于处理优化资源的工具链。
您可以使用基于 MD5 哈希的版本控制资源 URL
根据内容、固定的应用程序版本或其他信息计算得出。A (MD5 哈希) 是一个不错的选择,但有一些值得注意的例外(例如
JavaScript 资源)。VersionResourceResolver
ContentVersionStrategy
以下示例显示了如何在 Java 配置中使用:VersionResourceResolver
-
Java
-
Kotlin
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public/")
.resourceChain(true)
.addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public/")
.resourceChain(true)
.addResolver(VersionResourceResolver().addContentVersionStrategy("/**"))
}
}
可用于重写 URL 并应用解析程序和
转换器(例如,插入版本)。WebFlux 配置提供了一个,以便可以将其注入到其他配置中。ResourceUrlProvider
ResourceUrlProvider
与 Spring MVC 不同,目前在 WebFlux 中,没有办法透明地重写 static
资源 URL,因为没有可以使用非阻塞链的视图技术
的旋转转换器。当仅提供本地资源时,解决方法是直接使用(例如,通过自定义元素)和 block。ResourceUrlProvider
请注意,当同时使用(例如,Gzip、Brotli 编码)和 时,必须按该顺序注册它们,以确保基于内容的
版本始终基于未编码的文件进行可靠计算。EncodedResourceResolver
VersionedResourceResolver
对于 WebJar,版本化 URL (如)是推荐且最有效的使用方式。
相关资源位置使用 Spring Boot 开箱即用地配置(也可以配置
手动 ) 并且不需要添加依赖项。/webjars/jquery/1.2.0/jquery.min.js
ResourceHandlerRegistry
org.webjars:webjars-locator-core
无版本的 URL (如 )通过 类路径中存在库时自动注册的 来支持,但代价是
类路径扫描可能会减慢应用程序启动速度。解析器可以将 URL 重写为
包括 jar 的版本,还可以与没有版本的传入 URL 匹配 — 例如, from to 。/webjars/jquery/jquery.min.js
WebJarsResourceResolver
org.webjars:webjars-locator-core
/webjars/jquery/jquery.min.js
/webjars/jquery/1.2.0/jquery.min.js
基于 的 Java 配置提供了更多选项
进行精细控制,例如上次修改的行为和优化的资源解析。ResourceHandlerRegistry |
路径匹配
您可以自定义与路径匹配相关的选项。有关各个选项的详细信息,请参见 PathMatchConfigurer
javadoc。
以下示例演示如何使用:PathMatchConfigurer
-
Java
-
Kotlin
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.method.HandlerTypePredicate;
import org.springframework.web.reactive.config.EnableWebFlux;
import org.springframework.web.reactive.config.PathMatchConfigurer;
import org.springframework.web.reactive.config.WebFluxConfigurer;
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configurePathMatching(PathMatchConfigurer configurer) {
configurer.addPathPrefix(
"/api", HandlerTypePredicate.forAnnotation(RestController.class));
}
}
import org.springframework.context.annotation.Configuration
import org.springframework.web.bind.annotation.RestController
import org.springframework.web.method.HandlerTypePredicate
import org.springframework.web.reactive.config.EnableWebFlux
import org.springframework.web.reactive.config.PathMatchConfigurer
import org.springframework.web.reactive.config.WebFluxConfigurer
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
override fun configurePathMatching(configurer: PathMatchConfigurer) {
configurer.addPathPrefix(
"/api", HandlerTypePredicate.forAnnotation(RestController::class.java))
}
}
Spring WebFlux 依赖于请求路径的解析表示,该请求调用用于访问解码的路径段值,并删除了分号内容
(即 path 或 matrix 变量)。这意味着,与 Spring MVC 不同,您无需指明
是否解码请求路径,是否删除
路径匹配目的。 Spring WebFlux 也不支持后缀模式匹配,这与 Spring MVC 不同,在 Spring MVC 中,我们 也建议远离 依赖它。 |
阻止执行
WebFlux Java 配置允许您自定义 WebFlux 中的阻塞执行。
您可以通过提供
例如 VirtualThreadTaskExecutor
,如下所示:AsyncTaskExecutor
-
Java
-
Kotlin
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureBlockingExecution(BlockingExecutionConfigurer configurer) {
AsyncTaskExecutor executor = ...
configurer.setExecutor(executor);
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
@Override
fun configureBlockingExecution(configurer: BlockingExecutionConfigurer) {
val executor = ...
configurer.setExecutor(executor)
}
}
默认情况下,已配置的 controller 无法识别其返回类型的 controller 方法被视为阻塞,但您可以设置自定义控制器
方法 谓词 。ReactiveAdapterRegistry
BlockingExecutionConfigurer
WebSocket服务
WebFlux Java 配置声明了一个 bean,它提供
支持调用 WebSocket 处理程序。这意味着剩下的所有工作都要做
处理 WebSocket 握手请求的 order 是将 映射到 URL
通过。WebSocketHandlerAdapter
WebSocketHandler
SimpleUrlHandlerMapping
在某些情况下,可能需要使用
提供了允许配置 WebSocket 服务器属性的服务。
例如:WebSocketHandlerAdapter
WebSocketService
-
Java
-
Kotlin
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public WebSocketService getWebSocketService() {
TomcatRequestUpgradeStrategy strategy = new TomcatRequestUpgradeStrategy();
strategy.setMaxSessionIdleTimeout(0L);
return new HandshakeWebSocketService(strategy);
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
@Override
fun webSocketService(): WebSocketService {
val strategy = TomcatRequestUpgradeStrategy().apply {
setMaxSessionIdleTimeout(0L)
}
return HandshakeWebSocketService(strategy)
}
}
高级配置模式
@EnableWebFlux
导入:DelegatingWebFluxConfiguration
-
为 WebFlux 应用程序提供默认的 Spring 配置
-
检测并委托给 implementations 来自定义该配置。
WebFluxConfigurer
对于高级模式,您可以直接从 中删除和扩展,而不是实现 ,
如下例所示:@EnableWebFlux
DelegatingWebFluxConfiguration
WebFluxConfigurer
-
Java
-
Kotlin
@Configuration
public class WebConfig extends DelegatingWebFluxConfiguration {
// ...
}
@Configuration
class WebConfig : DelegatingWebFluxConfiguration {
// ...
}
您可以将现有方法保留在 中,但现在也可以覆盖 bean 声明
从基类中,并且仍然有任意数量的其他实现
类路径。WebConfig
WebMvcConfigurer