我有一个带有嵌套路由的RouterFunction,除一条路由外,其他所有功能都在做,我认为它们应该这样做。
但是,当我尝试在嵌套路由中调用根路由之一时,总是得到404。这仅在该特定路由中发生,当我将其从根更改为“ / foo”时,它开始工作。
< / p>
代码:
public RouterFunction<ServerResponse> productRouter(final ProductHandler handler) {
return nest(path(apiPath + BASE_PATH),
route(POST("/").and(contentType(MediaType.APPLICATION_JSON)), handler::handleCreateProduct)
.andRoute(GET("/{id}"), handler::handleGetProductById)
.andRoute(PUT("/").and(contentType(MediaType.APPLICATION_JSON)), handler::handleUpdateProduct)
.andRoute(GET("/"), handler::handleGetAllProducts)
.andNest(path("/category"),
route(POST("/").and(contentType(MediaType.APPLICATION_JSON)), handler::handleCreateProductCategory)
.andRoute(GET("/{id}"), handler::handleGetProductCategoryById)
.andRoute(GET("/"), handler::handleGetAllProductCategories)
.andRoute(GET("/search/{name}"), handler::handleGetProductCategoriesByName)
))
.andNest(path("/brand"),
route(POST("/").and(contentType(MediaType.APPLICATION_JSON)), handler::handleCreateProductBrand)
.andRoute(GET("/"), handler::handleGetAllProductBrands)
.andRoute(GET("/{id}"), handler::handleGetProductBrandById));
}
不正确的路由如下:
.andRoute(GET("/"), handler::handleGetAllProductCategories)
奇怪的是,在根路径和品牌路径下,我做的是完全相同的事情,并且这些路线都起作用。
感谢您的帮助
答案 0 :(得分:1)
我无法在Spring Boot 2.1.2.RELEASE上重现以下问题:
@Configuration
public class RouterConfig {
@Bean
public RouterFunction<ServerResponse> productRouter() {
return nest(path("/test"),
route(GET("/"), serverRequest -> ServerResponse.ok().syncBody("TEST"))
.andNest(path("/other"),
route(GET("/{id}"), serverRequest -> ServerResponse.ok().syncBody("ID"))
.andRoute(GET("/"), serverRequest -> ServerResponse.ok().syncBody("OTHER"))));
}
}
我得到结果:
➜ ~ http :8080/test
HTTP/1.1 200 OK
Content-Length: 4
Content-Type: text/plain;charset=UTF-8
TEST
➜ ~ http :8080/test/
HTTP/1.1 200 OK
Content-Length: 4
Content-Type: text/plain;charset=UTF-8
TEST
➜ ~ http :8080/test/other
HTTP/1.1 200 OK
Content-Length: 5
Content-Type: text/plain;charset=UTF-8
OTHER
➜ ~ http :8080/test/other/
HTTP/1.1 200 OK
Content-Length: 5
Content-Type: text/plain;charset=UTF-8
OTHER
➜ ~ http :8080/test/other/something
HTTP/1.1 200 OK
Content-Length: 2
Content-Type: text/plain;charset=UTF-8
ID
如果您设法在示例应用程序中重现此问题,请在Spring Framework issue tracker上创建一个问题,因为我没有找到与此相关的问题。请在那里提供一个示例项目,我们可以克隆并运行该项目以重现该问题。
答案 1 :(得分:0)
现在,Weblux中存在一个有关映射根元素的开放错误:https://github.com/spring-projects/spring-boot/issues/9785
您应该使用重定向,或者不使用“ /”映射。
答案 2 :(得分:0)
多亏了Brian Clozel的评论,我才得以弄清
keep in mind that router functions are about the first route that matches.
因此,考虑到这一点,我以以下方式重组了RouterFunction:
public RouterFunction<ServerResponse> productRouter(final ProductHandler handler) {
return nest(path(apiPath + BASE_PATH),
route(method(HttpMethod.POST).and(accept(MediaType.MULTIPART_FORM_DATA)), handler::handleCreateProduct)
.andNest(path("/category"),
route(GET("/{id}"), handler::handleGetProductCategoryById)
.andRoute(method(HttpMethod.POST).and(contentType(MediaType.APPLICATION_JSON)), handler::handleCreateProductCategory)
.andRoute(GET("/search/{name}"), handler::handleGetProductCategoriesByName)
.andRoute(method(HttpMethod.GET), handler::handleGetAllProductCategories))
.andNest(path("/brand"),
route(method(HttpMethod.POST).and(contentType(MediaType.APPLICATION_JSON)), handler::handleCreateProductBrand)
.andRoute(GET("/{id}"), handler::handleGetProductBrandById)
.andRoute(method(HttpMethod.GET), handler::handleGetAllProductBrands))
.andRoute(GET("/{id}/pdf"), handler::handlaProductDetailsPdf)
.andRoute(GET("/{id}"), handler::handleGetProductById)
.andRoute(method(HttpMethod.PUT).and(contentType(MediaType.APPLICATION_JSON)), handler::handleUpdateProduct)
.andRoute(method(HttpMethod.GET), handler::handleGetAllProducts));
}
我将/ category和/ brand路径在链中都移到了比根路径更高的位置,并且按预期运行。
再次向Brian寻求帮助!