Функциональный маршрут Spring Web Flux (реактивный) не работает должным образом с Kotlin

Привет, хорошие люди, заинтересованные в написании весенних приложений в Котлине. Я играю с моментальным снимком Spring Boot 2.0.0 и spring-webflux . Этот фрагмент кода:

 @Component class TestRouter() : RouterFunction<ServerResponse> { override fun route(request: ServerRequest) = route(request) { "/".route { GET("/hello") { ServerResponse.ok().body(BodyInserters.fromObject("World")) } "/{id}".route { GET("/hello") { ServerResponse.ok().body(BodyInserters.fromObject("World ${request.pathVariable("id")}")) } } } } } 

не работает должным образом (по крайней мере, как я ожидал :))

 ➜ ~ curl -i http://localhost:8080/hello HTTP/1.1 200 OK transfer-encoding: chunked Content-Type: text/plain;charset=UTF-8 World 

но:

 ➜ ~ curl -i http://localhost:8080/1/hello HTTP/1.1 404 Not Found content-length: 0 

Трассировка рабочего случая:

 2017-03-03 00:58:03.865 TRACE 7666 --- [ctor-http-nio-4] oswrfserver.RequestPredicates : Pattern "//**" matches against value "/hello" 2017-03-03 00:58:03.865 DEBUG 7666 --- [ctor-http-nio-4] oswrfunction.server.RouterFunctions : Nested predicate "//**" matches against "GET /hello" 2017-03-03 00:58:03.865 TRACE 7666 --- [ctor-http-nio-4] oswrfserver.RequestPredicates : Method "GET" matches against value "GET" 2017-03-03 00:58:03.866 TRACE 7666 --- [ctor-http-nio-4] oswrfserver.RequestPredicates : Pattern "/hello" matches against value "/hello" 2017-03-03 00:58:03.866 DEBUG 7666 --- [ctor-http-nio-4] oswrfunction.server.RouterFunctions : Predicate "(GET && /hello)" matches against "GET /hello" 

Не работает случай след:

 2017-03-03 00:59:26.958 TRACE 7666 --- [ctor-http-nio-1] oswrfserver.RequestPredicates : Pattern "//**" matches against value "/1/hello" 2017-03-03 00:59:26.958 DEBUG 7666 --- [ctor-http-nio-1] oswrfunction.server.RouterFunctions : Nested predicate "//**" matches against "GET /1/hello" 2017-03-03 00:59:26.958 TRACE 7666 --- [ctor-http-nio-1] oswrfserver.RequestPredicates : Method "GET" matches against value "GET" 2017-03-03 00:59:26.958 TRACE 7666 --- [ctor-http-nio-1] oswrfserver.RequestPredicates : Pattern "/hello" does not match against value "/1/hello" 2017-03-03 00:59:26.959 TRACE 7666 --- [ctor-http-nio-1] oswrfserver.RequestPredicates : Pattern "/{id}/**" matches against value "/1/hello" 2017-03-03 00:59:26.959 DEBUG 7666 --- [ctor-http-nio-1] oswrfunction.server.RouterFunctions : Nested predicate "/{id}/**" matches against "GET /1/hello" 2017-03-03 00:59:26.959 TRACE 7666 --- [ctor-http-nio-1] oswrfserver.RequestPredicates : Method "GET" matches against value "GET" 2017-03-03 00:59:26.959 TRACE 7666 --- [ctor-http-nio-1] oswrfserver.RequestPredicates : Pattern "/hello" does not match against value "/1/hello" 

Это похоже на ошибку (поскольку "/{id}".route {...} предположительно использует RouterFunctions.nest), но я мог ошибаться. Ваши мысли и помощь приветствуются.

Я, очевидно, знаю, что могу сделать работу /1/hello просто написав GET("/{id}/hello") { ... } , но меня интересует вложенный .route { ...} поскольку он поддерживает мой вариант использования добавления вложенных маршрутов из другого места (например, карты и т. д.).

Эта проблема была исправлена ​​в SPR-15310 .