我有一个反应核心WebClient发布到给定的 endpoints . 有效负载是JsonNodes的流量,内容类型是 application/stream+json
JsonNode response = localEP.post().uri( "/createItem" )
.contentType(MediaType.APPLICATION_STREAM_JSON)
.body( BodyInserters.fromPublisher(itemData, JsonNode.class ))
.retrieve()
.bodyToMono( JsonNode.class )
.block();
在服务器端,我尝试了Spring Controller样式和Spring Web Reactive FunctionHandler来处理上述调用的有效负载,其有效负载是Flux .
@PostMapping(path = "/dev/jobad/dynamo", consumes = MediaType.APPLICATION_STREAM_JSON_VALUE)
@ResponseStatus(HttpStatus.CREATED)
public Flux<JsonNode> loadItems (@RequestBody Flux<JsonNode> items) {
items.subscribe(storage::add);
JsonNode response = new ObjectMapper().createObjectNode().put( "shady", "shade" );
return Flux.just( response );
}
返回客户端始终没问题,但服务器报告助焊剂的内容为空 . 如果我将 (@RequestBody Flux<JsonNode> items
更改为 (@RequestBody JsonNode items
有效负载已收到 . WebClient日志似乎表明它已在线上写入数据并处理响应 . 然而身体似乎是空的
Reactor.core.Exceptions$ErrorCallbackNotImplemented: org.springframework.web.server.ServerWebInputException: Response status 400 with reason "Request body is missing: public reactor.core.publisher.Flux<com.fasterxml.jackson.databind.JsonNode> com.talroo.rest.JobResource.loadJobs(reactor.core.publisher.Flux<com.fasterxml.jackson.databind.JsonNode>)"
Caused by: org.springframework.web.server.ServerWebInputException:
Response status 400 with reason "Request body is missing: public
reactor.core.publisher.Flux<com.fasterxml.jackson.databind.JsonNode>
我需要做些什么来处理作为Flux的帖子的请求主体?
1 回答
首先,我不认为Spring正式支持直接从Controllers读/写Jackson
JsonNode
实例 . 您的应用程序应该要求域对象或类似Map<String, String>
.现在在Jackson的模型中,
JsonNode
代表JSON树中的任何节点 - 因为它是一棵树,你可以期望获得一个节点,但你显然能够获得根节点 - 这解释了你所看到的行为 .所以我认为你的应用程序应该依赖于更高级别的类,让 Jackson 为你反序列化它们 .
请注意,您的控制器实现也违反了一些规则:
你不应该在一个返回一个被动类型的方法中调用阻塞运算符,例如
block
(你的控制器没有破坏这个,但是关闭)你不应该打破被动管道并解除对请求的读取和写入响应;在您的控制器有机会读取整个请求之前,可能会关闭HTTP交换 . 调用
subscribe
只是这样做 .