我正在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
SearchServerConfig.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)!!
})
}
}
SearchServer.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) }
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句