首页 > 解决方案 > Spring WebFlux:POST 路由 ServerRequest 对象不包含正文或任何有用信息

问题描述

我正在 Kotlin 中编写 Spring WebFlux 路由来处理带有 JSON 主体的 POST 请求。但是,发送我的cURL请求后,我可以看到该ServerRequest对象中基本上什么都没有,当然不是我发送的 JSON。

curl -v -X POST -H "Content-Type: application/json" -d '{"key1":"value1","key2":"value2"}' http://myserver:8989/query

搜索服务器配置.kt

@Configuration
open class SearchServerConfig {

    @Bean
    open fun searchServer(): ISearchServer {
        return SearchServer()
    }

    @Bean
    open fun route(searchServer: ISearchServer): RouterFunction<ServerResponse?> {
        return RouterFunctions.route(
            RequestPredicates.POST("/query").and(RequestPredicates.accept(MediaType.APPLICATION_JSON)).and(RequestPredicates.contentType(MediaType.APPLICATION_JSON)),
            HandlerFunction { request: ServerRequest? -> searchServer.performQuery(request)!!
            })
    }
}

搜索服务器.kt

open class SearchServer() : ISearchServerService {
    companion object {
        val logger = LoggerFactory.getLogger(SearchServer::class.java)
    }

    override fun performQuery(request: ServerRequest?): Mono<ServerResponse?>? {
        logger.debug("!!>> request=[$request]")
        ...
}

日志中的此日志输出仅包含:

!!>> request=[HTTP POST /query]

很明显,当我尝试提取 JSON 正文时

val bodyData: String = request?.bodyToMono(JSONObject::class.java)?.toProcessor()?.peek()!!.toString()

它抛出一个 NPE。为什么没有来自cURL请求的正文,或任何标头,或任何东西?

标签: springspring-bootkotlinspring-webflux

解决方案


发布以防在某些时候对其他人有用。

问题更进一步,即使没有任何迹象表明身体存在映射问题,甚至 IntelliJ 的调试器也没有。它似乎完全忽略了它,唯一的问题是 NPE。

searchServer.performQuery()我试图将尸体提取到杰克逊ObjectNode

val bodyData: String = request?.bodyToMono(ObjectNode::class.java)?.toProcessor()?.peek()!!.toString()

更改为像这样直接使用 String 并订阅 Mono,它确实有效。

val bodyData = request?.bodyToMono(String::class.java)?.subscribe{ logger.info("Body", it) }

推荐阅读