WebFlux SpringBoot配置

开启WebFlux

@Configuration
@EnableWebFlux
public class WebConfig {
}

@EnableWebFlux注册了许多WebFlux基础Bean,同时也适应了类路径中可用的依赖——JSON、XML等

WebFlux 配置

Same in Spring MVC

Java配置需要实现WebFluxConfigurer 接口

@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {

    // Implement configuration methods...

}

转换,格式化

Same in Spring MVC

默认支持日期和数字转换类型,通过@NumberFormat 和 @DateTimeFormat 实现。如果在类路径上存在Joda时间,则还可以安装Joda时间格式化库

注册的自定义转换器

@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        // ...
    }

}

查看FormatterRegistrar SPI 和 更多有关转换器FormattingConversionServiceFactoryBean的信息

校验

Same in Spring MVC

默认情况下,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配置中声明的内容发生冲突。

内容类型解析器

Same in Spring MVC

可以配置Spring WebFlux从请求中确定请求的媒体类型。默认情况下,只支持一个"Accept"请求头,你也可以启用基于查询参数的策略。

@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {

    @Override
    public void configureContentTypeResolver(RequestedContentTypeResolverBuilder builder) {
        // ...
    }
}

HTTP编解码器

Same in Spring MVC

自定义响应请求的读写

@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {

    @Override
    public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
        // ...
    }
}

ServerCodecConfigurer提供一组默认阅读器和写入器。您可以使用它来添加更多的读者和作者,定制默认的,或者完全替换默认的。

Jackson的JSON和XML考虑使用Jackson2ObjectMapperBuilder。Jackson默认属性如下

  1. DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
  2. MapperFeature.DEFAULT_VIEW_INCLUSION

如果在类路径中检测到,它也会自动注册以下模块

  1. jackson-datatype-jdk7: support for Java 7 types likejava.nio.file.Path.

  2. jackson-datatype-joda: support for Joda-Time types.

  3. jackson-datatype-jsr310: support for Java 8 Date & Time API types.

  4. jackson-datatype-jdk8: support for other Java 8 types likeOptional.

视图解析器

Same in Spring MVC

@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;
    }

}

静态资源

Same in Spring MVC

该选项提供了一种便利的方法来从资源文件夹中提供静态资源。在下面的例子中,给定一个以“/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);
    }

}

资源处理器支持ResourceResolverResourceTransformer,它们可以用来创建一个工具链来处理优化的资源。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"

路径匹配

Same in Spring MVC

Spring WebFlux使用路径模式的解析代表——即请求路径,传入的路径——即分词RequestPath去除了指示是否对请求路径进行解码,或删除分号内容的需求,因为PathPattern可以访问解码路径段值并且可以安全地匹配。Spring WebFlux不支持后缀模式匹配,因此,只有两个小选项可以定制与路径匹配相关的内容——是否匹配斜杠和是否区分大小写匹配。

自定义选项

@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        // ...
    }

}

高级配置模式

Same in Spring MVC

@EnableWebFlux 导入 DelegatingWebFluxConfiguration 提供的默认SpringWebflux配置和检查Webflux的定制配置。

对于高级模式,直接继承DelegatingWebFluxConfiguration 的扩展而不是实现WebFluxConfigurer:

@Configuration
public class WebConfig extends DelegatingWebFluxConfiguration {

    // ...

}

可以在web配置中保存现有的方法。但是你现在也可以覆盖来自基类的bean声明,并且您仍然可以在类路径上拥有任意数量的WebMvcConfigurer

results matching ""

    No results matching ""