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

标签 java spring spring-mvc spring-boot servlets

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

但这不切实际,因为它们来自 3rd 方框架。
例如:H2服务器WebServletMetricsServletInstrumentedFilter .

有什么方法可以将 servlet 或 servlet 过滤器转换为其等效的 Webflux 版本?

最佳答案

您可以使用 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> 来添加 servlet 过滤器。 bean 并通过 Context 添加过滤器界面。例如:

@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

关于java - 我们可以在 Spring Webflux 中使用 web servlet 和 servlet 过滤器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48665814/

相关文章:

java.lang.ClassCastException : com. kk.COUNTRY 无法转换为 javax.xml.bind.JAXBElement

java - java中不使用库函数反转字符串

java - 从 Kafka 轮询时记录的顺序是否得到保证?

java - 从另一个类返回时变量中的值丢失

spring - 使用 spring 将 responseEntity 转换为 httpServletResponse

xml - Spring:java.util.Locale 类型的 bean 的 Autowiring 似乎不起作用

spring - 将 JdbcTokenStore 用于 JWT

java - Spring应用程序中的NoSuchBeanDefinitionException

java - Spring 3.0 MVC错误: Neither BindingResult nor plain target object for bean name 'login' available as request attribute

java - 使用现有数据库 hibernate