Spring WebFlux 功能路由器 + OpenAPI UI
Spring WebFlux functional router + OpenAPI UI
我想创建 OpenAPI UI 规范,在 Kotlin 上使用 Spring WebFlux 功能路由器。
Spring 启动 v.2.5.2,springdoc-openapi v.1.5.9。
这是我的路由器 class:
@Configuration
class UserServiceRouter {
@Bean
@RouterOperations(
RouterOperation(
path = "/user/{id}",
method = [RequestMethod.GET],
beanClass = UserService::class,
beanMethod = "getUserCredentialsById",
operation = Operation(
parameters = [Parameter(
style = ParameterStyle.SIMPLE,
explode = Explode.FALSE,
`in` = ParameterIn.PATH
)]
)
),
RouterOperation(
path = "/user/profile/{id}",
method = [RequestMethod.GET],
beanClass = UserService::class,
beanMethod = "getUserProfileById",
operation = Operation(
parameters = [Parameter(
style = ParameterStyle.SIMPLE,
explode = Explode.FALSE,
`in` = ParameterIn.PATH
)]
)
)
fun userRoute(userServiceHandler: UserServiceHandler) = coRouter {
("/user").nest {
GET("/{id}", userServiceHandler::getUserCredentialsById)
GET("/profile/{id}", userServiceHandler::getUserById)
}
}
}
我想创建一个 GET 查询,例如
http://localhost:8080/user/1
其中 1 是我想要的用户 ID。
但是我的 OpenAPI UI 仍然尝试使用 GET 参数创建查询
http://localhost:8080/user/{id}?id=1
这显然会导致错误 400。
很高兴知道如何正确配置我的@RouterOperations。
路径变量的正确配置如下所示
(为简洁起见,我在这里只留下了一个 GET 查询):
@Bean
@RouterOperations(
RouterOperation(
path = "/user/{id}",
method = arrayOf(RequestMethod.GET),
beanClass = UserService::class,
beanMethod = "getUserCredentialsById",
operation = Operation(
operationId = "getUserCredentialsById",
method = "GET",
parameters = [
Parameter(
name = "id",
`in` = ParameterIn.PATH,
style = ParameterStyle.SIMPLE,
explode = Explode.FALSE,
required = true
)]
)
)
)
fun userRoute(userServiceHandler: UserServiceHandler) = coRouter {
path("/user")
.nest {
GET("/{id}", userServiceHandler::getUserCredentialsById)
}
}
查看规格 here。
要点:
- 操作 ID 是必需的
Operation
parameters[]
中的默认值是“查询参数”而不是“路径参数”+我们应该
显式指向参数名称 (name = "id"
) 以覆盖默认值
行为。
- 如问题所述,
ParameterIn.PATH
也是强制性的。
我想创建 OpenAPI UI 规范,在 Kotlin 上使用 Spring WebFlux 功能路由器。 Spring 启动 v.2.5.2,springdoc-openapi v.1.5.9。 这是我的路由器 class:
@Configuration
class UserServiceRouter {
@Bean
@RouterOperations(
RouterOperation(
path = "/user/{id}",
method = [RequestMethod.GET],
beanClass = UserService::class,
beanMethod = "getUserCredentialsById",
operation = Operation(
parameters = [Parameter(
style = ParameterStyle.SIMPLE,
explode = Explode.FALSE,
`in` = ParameterIn.PATH
)]
)
),
RouterOperation(
path = "/user/profile/{id}",
method = [RequestMethod.GET],
beanClass = UserService::class,
beanMethod = "getUserProfileById",
operation = Operation(
parameters = [Parameter(
style = ParameterStyle.SIMPLE,
explode = Explode.FALSE,
`in` = ParameterIn.PATH
)]
)
)
fun userRoute(userServiceHandler: UserServiceHandler) = coRouter {
("/user").nest {
GET("/{id}", userServiceHandler::getUserCredentialsById)
GET("/profile/{id}", userServiceHandler::getUserById)
}
}
}
我想创建一个 GET 查询,例如
http://localhost:8080/user/1
其中 1 是我想要的用户 ID。
但是我的 OpenAPI UI 仍然尝试使用 GET 参数创建查询
http://localhost:8080/user/{id}?id=1
这显然会导致错误 400。 很高兴知道如何正确配置我的@RouterOperations。
路径变量的正确配置如下所示 (为简洁起见,我在这里只留下了一个 GET 查询):
@Bean
@RouterOperations(
RouterOperation(
path = "/user/{id}",
method = arrayOf(RequestMethod.GET),
beanClass = UserService::class,
beanMethod = "getUserCredentialsById",
operation = Operation(
operationId = "getUserCredentialsById",
method = "GET",
parameters = [
Parameter(
name = "id",
`in` = ParameterIn.PATH,
style = ParameterStyle.SIMPLE,
explode = Explode.FALSE,
required = true
)]
)
)
)
fun userRoute(userServiceHandler: UserServiceHandler) = coRouter {
path("/user")
.nest {
GET("/{id}", userServiceHandler::getUserCredentialsById)
}
}
查看规格 here。 要点:
- 操作 ID 是必需的
Operation
parameters[]
中的默认值是“查询参数”而不是“路径参数”+我们应该 显式指向参数名称 (name = "id"
) 以覆盖默认值 行为。- 如问题所述,
ParameterIn.PATH
也是强制性的。