【问题标题】:Reactor SubscriberContext not working for ServerRequest BodyReactor SubscriberContext 不适用于 ServerRequest 正文
【发布时间】:2021-06-02 06:42:25
【问题描述】:

当我们尝试从服务器请求正文设置上下文时,我们无法提取服务器请求正文。 当我们设置 POJO 时,我们能够从上下文中检索对象


  public Mono<ServerResponse> processuser(ServerRequest serverRequest) {
  
    return serverRequest
        .bodyToMono(FederationUserRequest.class)
        .flatMap(
            federationUserRequest ->
                Mono.subscriberContext()
                    .flatMap(ctx -> ctx.get("fed"))
                    //when we set the context from serverRequest it doesn't reach the next flatpMap
                    //when we set the context from Mono.just(new FederationUserRequest()) it works.
                    .flatMap(fur -> ServerResponse.ok().bodyValue(Mono.just("data")))
        .subscriberContext(ctx -> ctx.put("fed", getRequestBody(serverRequest)));
  }

  private Mono<FederationUserRequest> getRequestBody(ServerRequest serverRequest) {
 
    Mono<FederationUserRequest> req = Mono.just(serverRequest.bodyToMono(FederationUserRequest.class);
    return Mono.just(new FederationUserRequest()); -> Works, adds to context as MonoLiftFusable
    return req; -> Does not Work, adds to context as MonoLift
  }

【问题讨论】:

  • 你介意也包括不起作用的代码吗?
  • 另外,如果在错误期间发生任何错误,您能否包括任何错误日志或堆栈跟踪?
  • @MichaelMcFadyen 这行代码没有被执行java .flatMap(fur -&gt; ServerResponse.ok().bodyValue(Mono.just("data"))) 令人困惑的是日志中没有错误,它突然返回200,没有正文。这里的用例可能没有任何意义,但我想让示例保持简单。
  • 感谢您的回复。在最初的审查中,我会说你使用bodyToMono 两次消耗身体的事实是不寻常的。这通常会导致引发错误。我无法准确解释为什么它会静默失败,但我的猜测是 ctx.get("fed") 正在发出 COMPLETE 信号,导致 flatMap 被跳过。
  • @MichaelMcFadyen 这似乎是一个非常合理的回应。我们试图解决的是提取请求并将其设置到上下文中,以便在链中进一步访问。网上所有的例子和代码sn-ps都是针对静态值的...你能推荐我们如何从serverRequest中捕获值并将其设置到上下文中。

标签: java spring-boot spring-webflux project-reactor


【解决方案1】:

问题很简单。它一直盯着我看。 当我们调用

return serverRequest
        .bodyToMono(FederationUserRequest.class)

subscribe() 被隐式调用..

我们试图打电话

    Mono<FederationUserRequest> req = Mono.just(serverRequest.bodyToMono(FederationUserRequest.class);

再次基本上是完成订阅者。

代码应该是

 public Mono<ServerResponse> processuser(ServerRequest serverRequest) {
  Context context = Context.of("fed", Mono.just(serverRequest.bodyToMono(FederationUserRequest.class));


    return Mono.subscriberContext(ctx -> ctx.get("fed"))
        .flatMap(
            federationUserRequest ->
                Mono.subscriberContext()
                    .flatMap(ctx -> ctx.get("fed"))
                    .flatMap(fur -> ServerResponse.ok().bodyValue(Mono.just("data")))
        .subscriberContext(context);
  }
 

【讨论】:

    猜你喜欢
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2019-08-24
    相关资源
    最近更新 更多