You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Spring WebFlux时如何获取所有RequestHandlerMappings

你之前的方案在WebFlux环境失效,核心原因是Servlet栈和WebFlux栈的请求映射处理类是分属不同包的独立实现,你引入的是Servlet栈的org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping,自然在纯WebFlux环境中找不到对应的Bean。

正确实现方案

WebFlux环境注解式路由(@RestController、@RequestMapping声明的接口)对应的映射处理类为org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerMapping,直接替换原实现中的类即可,不需要手动扫描Controller,也无需提前知道Controller所属包名。

如果你的项目还用到了WebFlux的函数式路由,额外加载RouterFunctionMapping即可拿到全量端点。

完整实现代码如下:

import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.ApplicationContext;
import org.springframework.web.reactive.result.method.RequestMappingInfo;
import org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerMapping;
import org.springframework.web.reactive.function.server.support.RouterFunctionMapping;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class WebFluxEndpointListener implements ApplicationListener<ApplicationReadyEvent> {

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        ApplicationContext context = event.getApplicationContext();
        
        // 获取注解式路由端点
        RequestMappingHandlerMapping annotationMapping = context.getBean(RequestMappingHandlerMapping.class);
        annotationMapping.getHandlerMethods().forEach((info, method) -> {
            log.info("注解路由信息:{},处理方法:{}", info, method);
        });

        // 仅当项目使用函数式路由时需要打开下方注释
        // RouterFunctionMapping routerMapping = context.getBean(RouterFunctionMapping.class);
        // routerMapping.getHandlerMethods().forEach((info, method) -> {
        //     log.info("函数式路由信息:{},处理方法:{}", info, method);
        // });
    }
}

内容的提问来源于stack exchange,提问作者Adam Jarvis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:24:07