spring-webflux - 刷新react-app/webflux时如何修复 'Status and headers already sent'?

标签 spring-webflux spring-websocket okta

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

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

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

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

'IllegalStateException: Status and headers already sent'

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

我看之前Spring-boot升级到2.1.5后就遇到过这个问题,后来的版本已经解决了。我降级到 2.2.1 但仍然有同样的问题。 我的项目是:github-reactive-spring-tour

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

java.lang.IllegalStateException: Status and headers already sent at reactor.netty.http.server.HttpServerOperations.addHeader(HttpServerOperations.java:192) ~[reactor-netty-0.9.4.RELEASE.jar:0.9.4.RELEASE] at org.springframework.http.server.reactive.ReactorServerHttpResponse.applyCookies(ReactorServerHttpResponse.java:97) ~[spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE] at org.springframework.http.server.reactive.AbstractServerHttpResponse.lambda$doCommit$11(AbstractServerHttpResponse.java:238) ~[spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE] at reactor.core.publisher.MonoRunnable.subscribe(MonoRunnable.java:49) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.Mono.subscribe(Mono.java:4105) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at 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] at reactor.core.publisher.MonoFromFluxOperator.subscribe(MonoFromFluxOperator.java:72) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) ~[reactor-core-3.3.2.RELEASE.jar:3.3.2.RELEASE] at 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] at 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-boot 版本升级到 2.4.0,它开始工作了。

关于spring-webflux - 刷新react-app/webflux时如何修复 'Status and headers already sent'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59856292/

相关文章:

java - 使用 Okta 验证其余端点和 UI

spring-boot - Spring WebFlux - 如何从请求中获取数据?

spring - 如何使用 WebClient 压缩 JSON 请求正文?

java - 是否可以通过 Spring WebSocket 发送同步消息?

java - 在没有 Spring 身份验证的情况下通过 web-socket 多次回复

oauth - child 在 OAuth 2.0 流程上不匹配

spring-boot - Spring Webflux 上传大图片文件并以流方式使用 WebClient 发送文件

spring - 多线程环境下使用Spring WebClient的正确方法

java - 将 websocket 通信从客户端重定向到服务器到另一个 websocket 服务器

spring-boot - 配置多个 OAuth2 授权服务器和单个资源服务器之间的通信