【问题标题】:How can avoid breaking request flow in WebFilter when returning from inside another Mono<Object>>?从另一个 Mono<Object>> 内部返回时,如何避免中断 WebFilter 中的请求流?
【发布时间】:2021-06-23 16:52:09
【问题描述】:

这里有一些荒谬的代码示例

@Component
public final class ReCaptchaCheckWebFilter implements WebFilter {
  @Override
  public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
    return Mono.just("foo").map(s -> chain.filter(exchange)).then();
  }
}

使用这个 webfiler,请求永远不会到达我的控制器。它确实返回 200 http 状态码。

如果我发现自己需要从另一个 Mono 内部返回,那么在将请求沿过滤器链转发到控制器时该怎么做?

【问题讨论】:

    标签: java spring-boot reactive-programming spring-webflux


    【解决方案1】:

    chain.filter 返回一个 Mono,但在您的示例中,它不是流的一部分(没有订阅它)。要解决这个问题,应该使用flatMap 方法

        return Mono.just("foo").flatMap(s -> chain.filter(exchange));
    

    【讨论】:

    • 这是答案,但你能帮忙解释一下吗?我读过.map() 是同步的,而.flatMap() 是异步的,但不知道为什么这很重要。你是说如果我在.map() 后面加上.subscribe*(),它会起作用吗?
    • 不,在 webflux 应用程序中,你应该(几乎)永远不要使用 subscribe 方法,但你应该记住 Mono/Flux 在没有订阅的情况下不会执行(就像创建一个线程而不启动它一样)。请查看此答案stackoverflow.com/questions/49115135/map-vs-flatmap-in-reactor了解更多详情
    猜你喜欢
    • 2021-06-22
    • 2019-01-02
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    相关资源
    最近更新 更多