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();
- 支持
GET
、POST
、PUT
、DELETE
等 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。