当前位置: 首页 > 知识库问答 >
问题:

Spring Reactive WebFlux在使用Application/Stream+JSON时报告空流量

曾涵育
2023-03-14

我有一个反应核心WebClient可以发布到给定的endpoint。有效负载是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来处理上述调用的负载,负载是一个流量。

  @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 );
    }

返回到客户机总是ok,但是服务器报告通量的内容为空。如果我将(@requestbody flux 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>

我需要做什么才能将post的请求主体作为一个Flux来处理?

共有1个答案

淳于功
2023-03-14

首先,我不认为Spring正式支持直接从控制器读/写JacksonJsonNode实例。您的应用程序应该请求一个域对象或类似map 之类的东西。

在Jackson的模型中,jsonNode表示JSON树中的任何节点--由于它是一棵树,您可以期望得到一个flux节点,但显然能够得到根节点--这解释了您看到的行为。

所以我认为您的应用程序应该更多地依赖于更高级的类,并让Jackson为您反序列化它们。

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

  • 不应在返回反应类型的方法中调用阻塞运算符,如block
  • (您的控制器不是破坏此类型,而是关闭此类型)
  • 您不应破坏反应流水线,将请求的读取和响应的写入解耦;在您的控制器有机会读取整个请求之前,HTTP交换可能会被关闭。调用subscribe就是这样做的。
 类似资料:
  • 我的建筑.分级是: 我试图通过allure命令行(CLI)在本地打开.json和.xml结果。诱惑报表打开,但为空:这是一个报表视图 我想是我的错误在分级依赖。我相当困惑,应该为JUnit5+Allure2+Gradle+Selenide+Java8使用哪些库和版本?

  • 功能介绍 获取信息流分析报告数据,包括表格详情数据与趋势数据,所获取数据与 https://mtj.baidu.com 中报告数据一致 接口 https://openapi.baidu.com/rest/2.0/mtj/svc/app/getDataByKey 此处仅列本接口特有参数,公共参数请参考报告级API说明 获取总计数据 参数名 参数类型 是否必须 描述 method string 是

  • extentX看起来是完美的解决方案,是一组测试结果。 然而,我已经按照所有的说明进行了操作,并将所有内容都设置好并运行起来,但测试信息似乎没有到达扩展页。 它是空的。我可以从仪表板上看到测试已经运行,但项目是默认的,单击它们不会显示任何信息,但我可以看到它正在获取一些数据,因为它显示了已经运行了多少测试以及通过了多少信息。 有什么明显的我做错了吗? 我可以看到标准的数据块报告工作得很好,但它似乎

  • 使用指南 - 数据报告 - 流量分析 百度统计为您提供网站的流量、来源、页面、访客、转化、SEO等多种网站分析报告,支持多维度细分和自定义查看,帮助您进行SEM、SEO优化,提高转化率。 流量分析 网站流量趋势分析 实时访客报告简介 客户版屏蔽异常IP与访客 已屏蔽IP与访客的管理 访问时长的计算

  • 我们所运行的环境(Heroku),超过30秒的请求将被中断。因此,我们的web服务器(Unicorn)被设置为在15秒后中止。我们注意到,当请求被中断时,似乎没有任何信息被记录到NewRelic。 提前感谢!