在 Spring Boot WebFlux 上检索路径变量(函数式方法)

x80*_*486 4 kotlin spring-boot spring-webflux

假设我有这个路由器定义:

@Component
class PersonRouter(private val handler: PersonHandler) {
  @Bean
  fun router(): RouterFunction<ServerResponse> = router {
    ("/api/people" and accept(MediaType.APPLICATION_JSON_UTF8)).nest {
      GET("/{id}") { handler.findById(it) }
    }
  }
Run Code Online (Sandbox Code Playgroud)

然后这个处理程序:

@Component
@Transactional
class PersonHandler(private val repository: PersonRepository) {
  private companion object : KLogging()

  @Transactional(readOnly = true)
  fun findById(req: ServerRequest): Mono<ServerResponse> {
    logger.info { "${req.method()} ${req.path()}" }
    val uuid = ? // req.pathContainer().elements().last().value()
    return ServerResponse.ok()
        .contentType(MediaType.APPLICATION_JSON_UTF8)
        .body(BodyInserters.fromObject(repository.findById(uuid)))
        .switchIfEmpty(ServerResponse.notFound().build())
  }
}
Run Code Online (Sandbox Code Playgroud)

如何@PathVariable id: String在不使用正则表达式、字符串繁重等方面进行黑魔法的情况下访问标识符(典型的a 是什么@RestControllerServerRequest

x80*_*486 6

啊! 找到了!

它是通过这样做: req.pathVariable("id")

它一直在那里......在官方的Spring Framework(Web Reactive)文档中!