嵌套的 webflux 路由总是与顶部的路由一起使用

Jan*_*owy 2 java spring reactive-programming spring-webflux

任何人都可以在这个路由示例中告诉我,每次我输入 ex: /api/person/1 等时,它都会转到 /api/person 吗?无论我选择哪种方法,它总是与 /api/person 搭配。

@Bean
    public RouterFunction<ServerResponse> monoRouterFunction(PersonService personService) {

      return  RouterFunctions
                .nest(path("/api/person"),
                        route(method(GET), personService::findAllPeople)
                            .andRoute(GET("/{id}"), personService::findOnePerson)
                            .andRoute(POST("/add"), personService::addPerson)
                            .andRoute(PUT("/update"), personService::updatePerson)
                            .andRoute(DELETE("/delete/{id}"), personService::deletePerson));

}
Run Code Online (Sandbox Code Playgroud)

Kar*_*n R 7

下面的代码工作正常。我亲自在当地尝试过。正如 @Brain 所说,只需为 findAllPeople() 处理程序方法添加 GET("/") 即可。

@Bean
public RouterFunction<ServerResponse> monoRouterFunction(PersonService personService) 
{

 return  RouterFunctions
            .nest(path("/api/person"),
                    route(method(GET("/")), personService::findAllPeople)
                        .andRoute(GET("/{id}"), personService::findOnePerson)
                        .andRoute(POST("/add"), personService::addPerson)
                        .andRoute(PUT("/update"), personService::updatePerson)
                        .andRoute(DELETE("/delete/{id}"), personService::deletePerson));

}
Run Code Online (Sandbox Code Playgroud)

示例工作应用程序:https://github.com/karthikaiselvan/spring-reactive-mongo


Bri*_*zel 5

与注释模型不同,WebFlux.fn 对路由非常明确:排序和所有谓词都很重要。但好处是它更容易调试,您可以在谓词中设置调试点以了解为什么将请求路由到处理程序。

在这种情况下,这RouterFunction可以描述为:

如果路径以“/api/person”开头

  1. 方法是 GET -> 然后 personService::findAllPeople
  2. 方法是 POST 并且路径匹配 "/api/person/{id}" -> 然后 personService::findOnePerson
  3. 等等

因为第一场比赛赢了,一个像"GET /api/person/42"1)这样的请求会匹配 1),因为"/api/person"它是一个GET请求。

如果你想改变它,你可以改变路由的顺序,或者改变你的谓词route(GET("/"), personService::findAllPeople)