Я выполнял шаги, указанные в webflux-websocket-okta-blog , с R2DBC
и spring-data
.
После того, как я выполнил все шаги и протестировал ожидаемый промежуточный результат, я ожидал, что у меня будет веб-страница react
, на которой вставленные записи с помощью сценария создания в БД будут непосредственно отображаться на экране.
Это стало бы возможным через reactive websocket
, который отправляет сообщения после завершения вставки. Это должно привести к тому, что сообщение будет получено на стороне прослушивателя в приложении реакции. Сообщения содержат заголовок с токеном доступа.
Но вместо приходящих сообщений я получаю:
'IllegalStateException: Статус и заголовки уже отправлены'
в консоли при открытии localhost:3000
(страница реакции-приложения). Приложение все еще работает, и я могу обновить sh, но это только вызывает getAll, а не через ожидаемый (без F5) прямой путь веб-сокета / сообщения.
Я читал, что эта проблема встречалась ранее после Spring-boot обновление до 2.1.5, но оно было исправлено в более поздних версиях. Я понизил до 2.2.1, но все еще была та же проблема. Мой проект: github-реагирующий-весенний тур
Я получаю следующее в моей трассировке стека:
java .lang.IllegalStateException: Статус и заголовки уже отправлено по адресу processor.netty.http.server.HttpServerOperations.addHeader (HttpServerOperations. java: 192) ~ [реактор-нетто-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.ttplaserRR $ doCommit $ 11 (AbstractServerHttpResponse. java: 238) ~ [spring-web-5.2.3.RELEASE.jar: 5.2.3.RELEASE] в реакторе.core.publisher.MonoRunnable.subscribe (MonoRunnable. java: 49 ) ~ [реактор-ядро-3.3.2.RELEASE.jar: 3.3.2.RELEASE] в реакторе.core.publisher.Mono.subscribe (Mono. java: 4105) ~ [реактор-ядро-3.3.2. RELEASE.jar: 3.3.2.RELEASE] at processor.core.publisher.FluxConcatArray $ ConcatArraySubscriber.onComplete (FluxConcatArray. java: 207 ) ~ [реактор-ядро-3.3.2.RELEASE.jar: 3.3.2.RELEASE] в реакторе.core.publisher.FluxConcatArray.subscribe (FluxConcatArray. java: 80) ~ [реактор-актив-3.3.2. RELEASE.jar: 3.3.2.RELEASE] в реакторе.core.publisher. реактор.core.publisher.MonoDefer.subscribe (MonoDefer. java: 52) ~ [реактор-ядро-3.3.2.RELEASE.jar: 3.3.2.RELEASE] в реакторе.core.publisher.MonoIgnoreThen $ ThenIgnoreMain.drain (MonoIgnoreThen. java: 153) ~ [реактор-ядро-3.3.2.RELEASE.jar: 3.3.2.RELEASE] в реакторе.core.publisher.MonoIgnoreThen $ ThenIgnoreMain.ignoreDone (MonoIgnoreThen. java: 190) ~ [реактор-ядро-3.3.2.RELEASE.jar: 3.3.2.RELEASE] в реакторе.core.publisher. .RELEASE.jar: 3.3.2.RELEASE] at processor.core.publisher.Operators $ MultiSubscriptionSubscriber.onComplete (Операторы. java: 1871) ~ [реактор-ядро-3.3.2.RELEASE.jar: 3.3.2. РЕЛИЗ] * 102 9 *
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
});
});
}