spring-webflux - 刷新 react-app/webflux 时如何修复“状态和标头已发送”?
问题描述
我正在按照webflux-websocket-okta-blog中给出的步骤,使用R2DBC
和spring-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
});
});
}
解决方案
I've had the same issue. I've just bumpbed spring-boot version to 2.4.0 and it started working.
推荐阅读
- javascript - 节点js中的异步系列?页面首先呈现在数据之前
- ajax - 如何将数据从 django 传递到引导模式?
- spring - Spring Boot - Cacheable 似乎每次都进入该方法
- docker - Docker 卡在构建和其他命令上
- html - 如何在 Shiny 和 Shinydashboard 中自定义 HTML 文本和 verbatimTextOutput 之间的空间
- javascript - 未捕获的错误:不变违规和屏幕方向
- googletest - TEST、TEST_F 和 TEST_P 有什么区别?
- python - 如何删除文件基名的一部分并将其附加到文件名的末尾?
- node.js - 使用 mlflow 服务器启动服务器时,有没有办法隐藏 mlflow ui 标头?
- graph - 如何查看 Neo4j 中导入的 rdf 文件?