对于最新的稳定版本,请使用 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) {
// ...
}
}
ServerCodecConfigurer
提供一组默认读取器和写入器。您可以使用它来添加
更多读取器和写入器,自定义默认读取器和写入器,或完全替换默认读取器和写入器。
对于 Jackson JSON 和 XML,请考虑使用 Jackson2ObjectMapperBuilder
,
,它使用以下属性自定义 Jackson 的默认属性:
如果在 Classpath 中检测到以下众所周知的模块,它还会自动注册它们:
-
jackson-datatype-joda
:支持 Joda-Time 类型。 -
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
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer
.setUseCaseSensitiveMatch(true)
.addPathPrefix("/api", HandlerTypePredicate.forAnnotation(RestController.class));
}
}
@Configuration
@EnableWebFlux
class WebConfig : WebFluxConfigurer {
@Override
fun configurePathMatch(configurer: PathMatchConfigurer) {
configurer
.setUseCaseSensitiveMatch(true)
.addPathPrefix("/api", HandlerTypePredicate.forAnnotation(RestController::class.java))
}
}
Spring WebFlux 依赖于请求路径的解析表示,该请求调用用于访问解码的路径段值,并删除了分号内容
(即 path 或 matrix 变量)。这意味着,与 Spring MVC 不同,您无需指明
是否解码请求路径,是否删除
路径匹配目的。 Spring WebFlux 也不支持后缀模式匹配,这与 Spring MVC 不同,在 Spring MVC 中,我们 也建议远离 依赖它。 |
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