首页 文章

使用application / stream json时,Spring Reactive WebFlux报告空通量

提问于
浏览
0

我有一个反应核心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 回答

  • 1

    首先,我不认为Spring正式支持直接从Controllers读/写Jackson JsonNode 实例 . 您的应用程序应该要求域对象或类似 Map<String, String> .

    现在在Jackson的模型中, JsonNode 代表JSON树中的任何节点 - 因为它是一棵树,你可以期望获得一个节点,但你显然能够获得根节点 - 这解释了你所看到的行为 .

    所以我认为你的应用程序应该依赖于更高级别的类,让 Jackson 为你反序列化它们 .

    请注意,您的控制器实现也违反了一些规则:

    • 你不应该在一个返回一个被动类型的方法中调用阻塞运算符,例如 block (你的控制器没有破坏这个,但是关闭)

    • 你不应该打破被动管道并解除对请求的读取和写入响应;在您的控制器有机会读取整个请求之前,可能会关闭HTTP交换 . 调用 subscribe 只是这样做 .

相关问题