我们可以在Spring Webflux中使用Web servlet和servlet过滤器吗?

时间:2018-02-07 14:03:48

标签: java spring spring-mvc spring-boot servlets

我想从Spring MVC迁移到Spring Webflux,但是我从第三方使用了一些servlet过滤器和web servlet,必须迁移到等效的Webflux版本。

但这不可行,因为它们来自第三方框架。  例如:H2服务器WebServletMetricsServlet以及InstrumentedFilter

有没有办法将servlet或servlet过滤器转换为等效的Webflux版本?

1 个答案:

答案 0 :(得分:0)

您可以使用tomcat作为webflux实现(您可以通过排除netty starter并包括tomcat starter来实现此目的。)

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <version>${spring-boot.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
        <version>${spring-boot.version}</version>

        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-reactor-netty</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

您可以通过创建WebServerFactoryCustomizer<TomcatReactiveWebServerFactory> bean并通过Context接口添加过滤器来添加servlet过滤器。例如:

@Bean
public WebServerFactoryCustomizer<TomcatReactiveWebServerFactory> customizer() {
    return factory -> factory.addContextCustomizers(
            context -> {

                FilterDef filterDef = new FilterDef();
                filterDef.setFilterName("name");
                filterDef.setFilter(new SomeFilter());

                FilterMap filterMap = new FilterMap();
                filterMap.setFilterName("name");
                filterMap.addURLPattern("/url/pattern");

                context.addFilterMap(filterMap);
                context.addFilterDef(filterDef);
            }
    );
}

配置为webflux“实现”时,tomcat Servlet的默认名称为httpHandlerServlet