Как исправить «Статус и заголовки уже отправлены» при обновлении реагировать на приложение / webflux? - PullRequest
1 голос
/ 22 января 2020

Я выполнял шаги, указанные в 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
    });
  });
}
...