Add WebFlux SSE support with GSON

Closes gh-35884
This commit is contained in:
Sébastien Deleuze
2025-11-25 13:31:39 +01:00
parent c10266e57e
commit f3908832c5
3 changed files with 7 additions and 2 deletions
@@ -37,6 +37,7 @@ import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.http.MediaType;
import org.springframework.http.codec.HttpMessageEncoder;
import org.springframework.http.codec.ServerSentEvent;
import org.springframework.util.Assert;
import org.springframework.util.FastByteArrayOutputStream;
import org.springframework.util.MimeType;
@@ -106,7 +107,8 @@ public class GsonEncoder extends AbstractEncoder<Object> implements HttpMessageE
if (!super.canEncode(elementType, mimeType)) {
return false;
}
return !String.class.isAssignableFrom(elementType.toClass());
Class<?> elementClass = elementType.toClass();
return !(String.class.isAssignableFrom(elementClass) || ServerSentEvent.class.isAssignableFrom(elementClass));
}
@Override
@@ -58,6 +58,7 @@ class ServerDefaultCodecsImpl extends BaseDefaultCodecs implements ServerCodecCo
private @Nullable Encoder<?> getSseEncoder() {
return this.sseEncoder != null ? this.sseEncoder :
(JACKSON_PRESENT || JACKSON_2_PRESENT) ? getJacksonJsonEncoder() :
GSON_PRESENT ? getGsonEncoder() :
KOTLIN_SERIALIZATION_JSON_PRESENT ? getKotlinSerializationJsonEncoder() :
null;
}
@@ -23,6 +23,7 @@ import reactor.test.StepVerifier;
import org.springframework.core.ResolvableType;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.testfixture.codec.AbstractEncoderTests;
import org.springframework.http.codec.ServerSentEvent;
import org.springframework.web.testfixture.xml.Pojo;
import static org.assertj.core.api.Assertions.assertThat;
@@ -42,7 +43,8 @@ class GsonEncoderTests extends AbstractEncoderTests<GsonEncoder> {
assertThat(this.encoder.canEncode(pojoType, APPLICATION_JSON)).isTrue();
assertThat(this.encoder.canEncode(pojoType, APPLICATION_NDJSON)).isTrue();
assertThat(this.encoder.canEncode(pojoType, null)).isTrue();
assertThat(this.encoder.canEncode(ResolvableType.forClass(ServerSentEvent.class), null)).isFalse();
assertThat(this.encoder.canEncode(ResolvableType.forClass(String.class), null)).isFalse();
}
@Test