|
fun filter(filterFunction: (ServerRequest, (ServerRequest) -> ServerResponse) -> ServerResponse) { |
|
builder.filter { request, next -> |
|
filterFunction(request) { |
|
next.handle(request) |
|
} |
|
} |
|
fun filter(filterFunction: suspend (ServerRequest, suspend (ServerRequest) -> ServerResponse) -> ServerResponse) { |
|
builder.filter { serverRequest, handlerFunction -> |
|
mono(Dispatchers.Unconfined) { |
|
filterFunction(serverRequest) { |
|
handlerFunction.handle(serverRequest).awaitSingle() |
|
} |
|
} |
|
} |
|
} |
- Function
filterFunction takes serverRequest and function handler as parameters. (I just name it second parameter of filterFunction as handler.)
- Function
handler also takes serverRequest as parameter.
- These DSLs define
handler.
- Function
handlers that these DSLs defined are now using mistakenly filterFunction's serverRequest, not their own serverRequest parameters, which makes their own parameters meaningless.
This bug only exists in Kotlin DSL.
You can see java codes have no problem as follows.
|
R filter(ServerRequest request, HandlerFunction<T> next) throws Exception; |
|
Mono<R> filter(ServerRequest request, HandlerFunction<T> next); |
In java you can override filter something like
ServerRequest newRequest = someOperation(request)
return next.handle(newRequest)
but in Kotlin DSL, even if you write
filter { serverRequest, handlerFunction ->
val newServerRequest = someOperation(serverRequest)
handlerFunction(newServerRequest)
}
handlerFunction will use original serverRequest, not the newServerRequest
spring-framework/spring-webmvc/src/main/kotlin/org/springframework/web/servlet/function/RouterFunctionDsl.kt
Lines 650 to 655 in 5b1ab31
spring-framework/spring-webflux/src/main/kotlin/org/springframework/web/reactive/function/server/CoRouterFunctionDsl.kt
Lines 531 to 539 in 5b1ab31
filterFunctiontakesserverRequestand functionhandleras parameters. (I just name it second parameter offilterFunctionashandler.)handleralso takesserverRequestas parameter.handler.handlers that these DSLs defined are now using mistakenlyfilterFunction'sserverRequest, not their ownserverRequestparameters, which makes their own parameters meaningless.This bug only exists in Kotlin DSL.
You can see java codes have no problem as follows.
spring-framework/spring-webmvc/src/main/java/org/springframework/web/servlet/function/HandlerFilterFunction.java
Line 46 in 01e50fb
spring-framework/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/HandlerFilterFunction.java
Line 48 in 01e50fb
In java you can override filter something like
but in Kotlin DSL, even if you write
filter { serverRequest, handlerFunction -> val newServerRequest = someOperation(serverRequest) handlerFunction(newServerRequest) }handlerFunction will use original serverRequest, not the newServerRequest