Java Spring-webflux-Routing
我正在使用SpringBoot2.3.3.RELASE和webflux。使用下面的路由器配置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
@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()