diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/SseServerResponse.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/SseServerResponse.java index dc42b78a2dd..b12a672c6d5 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/function/SseServerResponse.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/function/SseServerResponse.java @@ -17,7 +17,6 @@ package org.springframework.web.servlet.function; import java.io.IOException; -import java.io.OutputStream; import java.nio.charset.StandardCharsets; import java.time.Duration; import java.util.Collections; @@ -137,9 +136,8 @@ final class SseServerResponse extends AbstractServerResponse { public void send() throws IOException { this.builder.append('\n'); try { - OutputStream body = this.outputMessage.getBody(); - body.write(builderBytes()); - body.flush(); + this.outputMessage.getBody().write(builderBytes()); + this.outputMessage.flush(); } catch (IOException ex) { this.sendFailed = true; diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/SseServerResponseTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/SseServerResponseTests.java index a23f0fdcc0b..964238abe81 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/function/SseServerResponseTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/function/SseServerResponseTests.java @@ -75,6 +75,41 @@ class SseServerResponseTests { assertThat(this.mockResponse.getContentAsString()).isEqualTo(expected); } + @Test // gh-36537 + void sendStringFlushesResponse() throws Exception { + ServerResponse response = ServerResponse.sse(sse -> { + try { + sse.send("foo bar"); + } + catch (IOException ex) { + throw new UncheckedIOException(ex); + } + }); + + ServerResponse.Context context = Collections::emptyList; + + response.writeTo(this.mockRequest, this.mockResponse, context); + assertThat(this.mockResponse.isCommitted()).isTrue(); + } + + @Test // gh-36537 + void sendObjectFlushesResponse() throws Exception { + Person person = new Person("John Doe", 42); + ServerResponse response = ServerResponse.sse(sse -> { + try { + sse.send(person); + } + catch (IOException ex) { + throw new UncheckedIOException(ex); + } + }); + + ServerResponse.Context context = () -> List.of(new JacksonJsonHttpMessageConverter()); + + response.writeTo(this.mockRequest, this.mockResponse, context); + assertThat(this.mockResponse.isCommitted()).isTrue(); + } + @Test void sendObject() throws Exception { Person person = new Person("John Doe", 42);