spring - 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
请求的正文,或任何标头,或任何东西?
解决方案
发布以防在某些时候对其他人有用。
问题更进一步,即使没有任何迹象表明身体存在映射问题,甚至 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) }
推荐阅读
- c# - 根据c#中的行号获取文本文件中字符串的位置
- html - CSS网格透视/变换
- angular - 如何在使用 setTimeout() 完全加载网页之前在模板中使用引导微调器?
- database - Laravel Virgin:在参与关系的模型的 mutator 中访问逆模型关系
- c++ - 忽略流中输入字符的最佳方法
- python - 前 N 行,直到找到值不为空
- terraform - Terraform:以合理的方式填充对象,然后部分覆盖?
- version - 如何将 cdm.exe 中的 firebase-tools 降级到 6.0.0?
- angular - 导航到其他组件并返回不会再次触发 ngFor
- node.js - 带有 Browserify 的反应式友好库?