RouterFunction 类详解

时间:2025-03-09 09:58:53

1. 核心定义与作用

RouterFunction 是 Spring WebFlux 函数式编程模型的核心类,用于定义请求路径与处理器(HandlerFunction)的映射规则,对标传统 Spring MVC 的 @RequestMapping 注解。其核心作用是将 HTTP 请求路由到对应的业务逻辑处理函数12


2. 路由构建方式

通过链式 API 或静态方法创建路由规则:

  • 链式构建(推荐):
RouterFunction<ServerResponse> route = RouterFunctions.route()
    .GET("/users", accept(MediaType.APPLICATION_JSON), handler::getAllUsers)
    .POST("/users", handler::createUser)
    .build();
  • 支持 GETPOSTPUTDELETE 等 HTTP 方法快捷定义23
  • 静态方法创建
RouterFunction<ServerResponse> route = RouterFunctions.route(
    RequestPredicates.GET("/hello"), 
    request -> ServerResponse.ok().bodyValue("Hello")
);

3. 请求谓词(RequestPredicate)

用于添加路由匹配的附加条件(如路径、请求头、参数等):

RouterFunction<ServerResponse> route = RouterFunctions.route()
    .GET("/user/{id}", 
        RequestPredicates.queryParam("name", value -> true),  // 必须包含 name 查询参数
        handler::getUserById
    )
    .build();

常用谓词包括:

  • RequestPredicates.path(String path):路径匹配
  • RequestPredicates.accept(MediaType type):请求头 Accept 匹配
  • RequestPredicates.queryParam(String param, Predicate<String> predicate):查询参数验证24

4. 嵌套路由与组合

支持通过 and()andRoute() 等方法组合多个路由规则:

RouterFunction<ServerResponse> nestedRoute = RouterFunctions.route()
    .path("/api", builder -> builder
        .GET("/v1/data", handler::getDataV1)
        .GET("/v2/data", handler::getDataV2)
    )
    .andRoute(
        RequestPredicates.POST("/upload"), 
        handler::uploadFile
    )
    .build();

可实现模块化路由管理34


5. 与 HandlerFunction 交互

RouterFunction 将请求路由到 HandlerFunction,后者处理请求并返回 Mono<ServerResponse>

public class UserHandler {
    public Mono<ServerResponse> getAllUsers(ServerRequest request) {
        Flux<User> users = userRepository.findAll();
        return ServerResponse.ok().body(users, User.class);
    }
}

通过 RouterFunction 绑定处理器方法37


6. 过滤器(HandlerFilterFunction)

可在路由前后添加拦截逻辑(如鉴权、日志):

HandlerFilterFunction<ServerResponse, ServerResponse> logFilter = (request, next) -> {
    System.out.println("Request path: " + request.path());
    return next.handle(request);
};

RouterFunction<ServerResponse> filteredRoute = route
    .filter(logFilter)
    .build();

支持多过滤器链式调用56


7. 异常处理

通过全局异常处理器或路由内 onErrorResume 捕获异常:

RouterFunction<ServerResponse> route = RouterFunctions.route()
    .GET("/error-demo", request -> 
        Mono.error(new IllegalArgumentException("参数错误"))
            .onErrorResume(e -> ServerResponse.badRequest().bodyValue(e.getMessage()))
    )
    .build();

也可通过 WebFilter 实现全局异常处理5


8. 实际应用示例

@Configuration
public class RouterConfig {
    @Bean
    public RouterFunction<ServerResponse> route(UserHandler handler) {
        return RouterFunctions.route()
            .GET("/users/{id}", 
                RequestPredicates.accept(MediaType.APPLICATION_JSON), 
                handler::getUserById
            )
            .POST("/users", 
                RequestPredicates.contentType(MediaType.APPLICATION_JSON), 
                handler::createUser
            )
            .filter((request, next) -> {
                if (!request.headers().header("Authorization").isEmpty()) {
                    return next.handle(request);
                }
                return ServerResponse.status(HttpStatus.UNAUTHORIZED).build();
            })
            .build();
    }
}

此配置实现带鉴权过滤器的 RESTful 接口路由23


关键特性总结

  • 函数式风格:通过链式 API 显式声明路由,增强可读性和灵活性12
  • 非阻塞处理:全链路基于 Reactor 的 Mono/Flux 实现异步响应式编程38
  • 组合与扩展:支持路由嵌套、过滤器链和谓词组合,适应复杂业务场景46