WebFlux SpringBoot配置
开启WebFlux
@Configuration
@EnableWebFlux
public class WebConfig {
}
@EnableWebFlux注册了许多WebFlux基础Bean,同时也适应了类路径中可用的依赖——JSON、XML等
WebFlux 配置
Java配置需要实现WebFluxConfigurer 接口
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
// Implement configuration methods...
}
转换,格式化
默认支持日期和数字转换类型,通过@NumberFormat 和 @DateTimeFormat 实现。如果在类路径上存在Joda时间,则还可以安装Joda时间格式化库
注册的自定义转换器
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
// ...
}
}
查看FormatterRegistrar SPI 和 更多有关转换器
FormattingConversionServiceFactoryBean
的信息
校验
默认情况下,Bean Validation出现在类路径中。例如——HibernateValidator通过 LocalValidatorFactoryBean
使用@Valid作为全局Validator对象,校验@Controller的方法参数
自定义校验器
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public Validator getValidator(); {
// ...
}
}
你也可以注册校验器到本地
@Controller
public class MyController {
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.addValidators(new FooValidator());
}
}
如果你需要一个
LocalValidatorFactoryBean 注入,
创建一个bean并将其标记为@PrimaryIn
,以避免与在MVC配置中声明的内容发生冲突。
内容类型解析器
可以配置Spring WebFlux从请求中确定请求的媒体类型。默认情况下,只支持一个"Accept"请求头,你也可以启用基于查询参数的策略。
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureContentTypeResolver(RequestedContentTypeResolverBuilder builder) {
// ...
}
}
HTTP编解码器
自定义响应请求的读写
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
// ...
}
}
ServerCodecConfigurer提供一组默认阅读器和写入器。您可以使用它来添加更多的读者和作者,定制默认的,或者完全替换默认的。
Jackson的JSON和XML考虑使用Jackson2ObjectMapperBuilder。Jackson默认属性如下
如果在类路径中检测到,它也会自动注册以下模块
jackson-datatype-jdk7: support for Java 7 types like
java.nio.file.Path
.jackson-datatype-joda: support for Joda-Time types.
jackson-datatype-jsr310: support for Java 8 Date & Time API types.
jackson-datatype-jdk8: support for other Java 8 types like
Optional
.
视图解析器
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
// ...
}
}
FreeMarker注册还需要底层的视图技术
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
// ...
@Bean
public FreeMarkerConfigurer freeMarkerConfigurer() {
FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
configurer.setTemplateLoaderPath("classpath:/templates");
return configurer;
}
}
静态资源
该选项提供了一种便利的方法来从资源文件夹中提供静态资源。在下面的例子中,给定一个以“/resources”开头的请求,相对路径被用来查找类路径上的“/static”的静态资源。资源将在未来1年才到期,以确保最大限度地使用浏览器缓存,并减少浏览器发出的HTTP请求。last - modified头做判断,如果在缓存中存在,则返回304状态码
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public", "classpath:/static/")
.setCachePeriod(31556926);
}
}
资源处理器支持ResourceResolver和ResourceTransformer,它们可以用来创建一个工具链来处理优化的资源。VersionResourceResolver可以用来进行版本资源URL的基于MD5散列算法的内容计算、固定的版本号或者其他。MD5散列是一个不错的选择,但是有些还有更好的选择(例如:JavaScript资源使用模块加载程序)
java配置:
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public/")
.resourceChain(true)
.addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
}
}
你可以使用ResourceUrlProvider重写url并且可申请完整的解析器和转换器链。例如:WebFlux config提供了一个ResourceUrlProvider为了方便插入版本
与Spring MVC的不同,目前,没有任何方法可以透明地重写静态资源url,因为没有视图技术可以使用非阻塞链的解析器和转换器(例如:Amazon S3 资源)。直接使用ResourceUrlProvider只提供本地资源
WebJars也支持 WebJarsResourceResolver 。当org.webjars:webjars-locator存在类路径中可以自动注册。resolver可以重新编写url以包含jar版本,而且还可以与没有版本的输入url匹配。例如:"/jquery/jquery.min.js"、"/jquery/1.2.0/jquery.min.js"
路径匹配
Spring WebFlux使用路径模式的解析代表——即请求路径,传入的路径——即分词RequestPath去除了指示是否对请求路径进行解码,或删除分号内容的需求,因为PathPattern可以访问解码路径段值并且可以安全地匹配。Spring WebFlux不支持后缀模式匹配,因此,只有两个小选项可以定制与路径匹配相关的内容——是否匹配斜杠和是否区分大小写匹配。
自定义选项
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
// ...
}
}
高级配置模式
@EnableWebFlux 导入 DelegatingWebFluxConfiguration 提供的默认SpringWebflux配置和检查Webflux的定制配置。
对于高级模式,直接继承DelegatingWebFluxConfiguration 的扩展而不是实现WebFluxConfigurer:
@Configuration
public class WebConfig extends DelegatingWebFluxConfiguration {
// ...
}
可以在web配置中保存现有的方法。但是你现在也可以覆盖来自基类的bean声明,并且您仍然可以在类路径上拥有任意数量的WebMvcConfigurer