springboot-version
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.3</version>
</parent>
usage:
@Bean
public RouterFunction<ServerResponse> timeRouter(ApiRouter apiRouter) {
return route().add(apiRouter).filter(new ApiPathHandlerFilterFunction()).build();
}
@Service
public class ApiRouter implements RouterFunction<ServerResponse> {
private final SimpleInvokeHandler simpleInvokeHandler;
public ApiRouter(SimpleInvokeHandler simpleInvokeHandler) {
this.simpleInvokeHandler = simpleInvokeHandler;
}
@Override
public Mono<HandlerFunction<ServerResponse>> route(ServerRequest request) {
return Mono.just(simpleInvokeHandler);
}
}
@Slf4j
@Order(-1)
public class SimpleInvokeHandler implements HandlerFunction<ServerResponse> {
@Override
public Mono<ServerResponse> handle(ServerRequest request) {
return ServerResponse.ok().bodyValue("hello");
}
}
@Slf4j
@Service
public class ApiPathHandlerFilterFunction implements HandlerFilterFunction<ServerResponse, ServerResponse> {
@Override
public Mono<ServerResponse> filter(ServerRequest request, HandlerFunction<ServerResponse> next) {
String originRequestUrl = request.path();
log.info("originRequestUrl:{}",originRequestUrl);
return next.handle(request);
}
}
question:
the RouterFunction be add twice,the HandlerFilterFunction will not be called,unless assign Order
Comment From: tangyaya8
this can resovle problem
@Bean()
public RouterFunction<ServerResponse> timeRouter(ApiRouter apiRouter, ApiPathHandlerFilterFunction apiPathHandlerFilterFunction) {
return RouterFunctions.route().filter(apiPathHandlerFilterFunction).add(apiRouter::route).build();
}
@Service
@Slf4j
public class ApiRouter {
private final SimpleInvokeHandler simpleInvokeHandler;
public ApiRouter(SimpleInvokeHandler simpleInvokeHandler) {
this.simpleInvokeHandler = simpleInvokeHandler;
}
public Mono<HandlerFunction<ServerResponse>> route(ServerRequest request) {
return Mono.just(simpleInvokeHandler);
}
}