首页 > 解决方案 > 刷新 react-app/webflux 时如何修复“状态和标头已发送”?

问题描述

我正在按照webflux-websocket-okta-blog中给出的步骤,使用R2DBCspring-data

在我完成所有步骤并测试其间的预期结果后,我希望react通过创建脚本将记录插入数据库的网页将直接显示在屏幕上。

这可以通过在reactive websocket插入完成时发送消息来实现。这应该会导致消息到达 react-app 中的侦听器端。消息包含带有访问令牌的标头。

但是我得到的不是消息,而是:

'IllegalStateException:状态和标头已发送'

localhost:3000当我打开(react-app 页面)时在控制台中。该应用程序仍然可以运行,我可以刷新,但这只是触发 getAll 而不是通过预期的(没有 F5)直接 websocket/消息方式。

我读到这个问题在 Spring-boot 升级到 2.1.5 后早些时候遇到过,但在以后的版本中得到了解决。我降级到 2.2.1 但仍然有同样的问题。我的项目是:github-reactive-spring-tour

我在我的堆栈跟踪中得到以下信息:

java.lang.IllegalStateException:状态和标头已经发送到 reactor.netty.http.server.HttpServerOperations.addHeader(HttpServerOperations.java:192) ~[reactor-netty-0.9.4.RELEASE.jar:0.9.4.RELEASE]在 org.springframework.http.server.reactive.ReactorServerHttpResponse.applyCookies(ReactorServerHttpResponse.java:97) ~[spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE] 在 org.springframework.http.server。 reactive.AbstractServerHttpResponse.lambda$doCommit$11(AbstractServerHttpResponse.java:238) ~[spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE] 在 reactor.core.publisher.MonoRunnable.subscribe(MonoRunnable.java: 49) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] 在 reactor.core.publisher.Mono.subscribe(Mono.java:4105) ~[reactor-core-3.3.2.RELEASE .jar:3.3.2.RELEASE] 在 reactor.core.publisher。FluxConcatArray$ConcatArraySubscriber.onComplete(FluxConcatArray.java:207) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.FluxConcatArray.subscribe(FluxConcatArray.java:80) ~ [reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] 在 reactor.core.publisher.MonoFromFluxOperator.subscribe(MonoFromFluxOperator.java:72) ~[reactor-core-3.3.2.RELEASE.jar: 3.3.2.RELEASE] 在 reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] 在 reactor.core.publisher。 MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:153) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.ignoreDone(MonoIgnoreThen.java:190 ) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] 在 reactor.core.publisher。MonoIgnoreThen$ThenIgnoreInner.onComplete(MonoIgnoreThen.java:240) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onComplete(Operators.java:1871 ) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE]

async componentDidMount() {
  this.setState({
    isLoading: true
  });
  const headers = {
    headers: {
      Authorization: 'Bearer ' + await this.props.auth.getAccessToken()
    }
  };

  const response = await fetch('http://localhost:8088/renners', headers);
  const data = await response.json();
  this.setState({
    renners: data,
    isLoading: false
  });

  const socket = new WebSocket('ws://localhost:8088/ws/renners');
  socket.addEventListener('message', async(event: any) => {
    const renner = JSON.parse(event.data);
    this.state.renners.push(renner);
    this.setState({
      renners: this.state.renners
    });
  });
}

标签: spring-webfluxspring-websocketokta

解决方案


I've had the same issue. I've just bumpbed spring-boot version to 2.4.0 and it started working.


推荐阅读