Java Spring-webflux-Routing

Java Spring-webflux-Routing,java,spring-boot,spring-webflux,Java,Spring Boot,Spring Webflux,我正在使用SpringBoot2.3.3.RELASE和webflux。使用下面的路由器配置 @Bean public RouterFunction<ServerResponse> itemRoute() { return RouterFunctions.route(POST("/api/v1/item").and(accept(APPLICATION_JSON)), itemHandler::createItem) .andRou

我正在使用SpringBoot2.3.3.RELASE和webflux。使用下面的路由器配置

@Bean
public RouterFunction<ServerResponse> itemRoute() {
    return RouterFunctions.route(POST("/api/v1/item").and(accept(APPLICATION_JSON)), itemHandler::createItem)
            .andRoute(GET("/api/v1/item/{itemId}").and(accept(APPLICATION_JSON)), itemHandler::getItemById)
            .andRoute(GET("/api/v1/item/list").and(accept(APPLICATION_JSON)), itemHandler::getItems);
}
@Bean
公共路由函数itemRoute(){
return RouterFunctions.route(POST(“/api/v1/item”).and(accept(APPLICATION_JSON)),itemHandler::createItem)
.andRoute(GET(“/api/v1/item/{itemId}”).and(accept(APPLICATION_JSON)),itemHandler::getItemById)
.andRoute(GET(“/api/v1/item/list”).and(accept(APPLICATION_JSON)),itemHandler::getItems);
}
当我点击
/api/v1/item/1
-->时,它会按预期工作

但是,点击
/api/v1/list
也会转到
getItemById
,而不是
getItems
/api/v1/item/list
也被视为
/api/v1/item/{itemId}
,列表以itemId的形式出现


这有什么问题吗?

针对
andRoute的Spring文档

返回一个组合的路由函数,如果该路由不匹配且应用了给定的请求谓词,则该函数将路由到给定的处理程序函数

这里的关键词是合成的。这意味着您可以声明多个路由,这些路由必须一起匹配才能触发路由

您正在寻找的可能只是使用普通的
route
builder函数

以spring文档为例:

RouterFunction<ServerResponse> route = route()
    .GET("/person/{id}", accept(APPLICATION_JSON), handler::getPerson) 
    .GET("/person", accept(APPLICATION_JSON), handler::listPeople) 
    .POST("/person", handler::createPerson) 
    .add(otherRoute) 
    .build();

对于list,将/list添加到list api的行为也与本例相同。如果希望在
/list
/list/{value}之间有具体区别
然后,您必须自己执行空检查,检查值是否存在,因为框架无法确定您是否希望发送空值。这不是人工智能。路线是按照定义的顺序进行评估的。如果希望
/item/list
映射到唯一的hander函数,则在
/item/{item\u id}
路由定义上方定义它。尽管如另一条评论中所述,这感觉不是restful。为什么您需要在url末尾添加
/list
?如果遵循restful api设计,
/api/v1/item
不应该返回所有项的列表吗?
RouterFunction<ServerResponse> route = route()
        .path("/api/person", builder -> builder
            .POST( ...)
            .GET( ... )
            .GET( ... )
        ).build())
    .build()