使用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
相关产品推荐
相关产品推荐

