diff --git a/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2JsonEncoder.java b/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2JsonEncoder.java index d2fa9067bc9..8ed922408c2 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2JsonEncoder.java +++ b/spring-web/src/main/java/org/springframework/http/codec/json/Jackson2JsonEncoder.java @@ -124,7 +124,7 @@ public class Jackson2JsonEncoder extends Jackson2CodecSupport implements HttpMes return Flux.from(inputStream).map(value -> encodeValue(value, mimeType, bufferFactory, elementType, hints)); } - else if (MediaType.APPLICATION_STREAM_JSON.isCompatibleWith(mimeType)) { + else if (this.streamingMediaTypes.stream().anyMatch(streamingMediaType -> streamingMediaType.isCompatibleWith(mimeType))) { return Flux.from(inputStream).map(value -> { DataBuffer buffer = encodeValue(value, mimeType, bufferFactory, elementType, hints); buffer.write(new byte[]{'\n'}); diff --git a/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonEncoderTests.java b/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonEncoderTests.java index 5726d6c5550..c7fe522c9f8 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonEncoderTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/json/Jackson2JsonEncoderTests.java @@ -16,6 +16,7 @@ package org.springframework.http.codec.json; +import java.util.Arrays; import java.util.Map; import com.fasterxml.jackson.annotation.JsonTypeInfo; @@ -32,6 +33,7 @@ import reactor.test.StepVerifier; import org.springframework.core.ResolvableType; import org.springframework.core.io.buffer.AbstractDataBufferAllocatingTestCase; import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.http.MediaType; import org.springframework.http.codec.Pojo; import org.springframework.http.codec.ServerSentEvent; @@ -108,6 +110,26 @@ public class Jackson2JsonEncoderTests extends AbstractDataBufferAllocatingTestCa .verifyComplete(); } + @Test // SPR-15727 + public void encodeAsStreamWithCustomStreamingType() throws Exception { + MediaType fooMediaType = new MediaType("application", "foo"); + MediaType barMediaType = new MediaType("application", "bar"); + this.encoder.setStreamingMediaTypes(Arrays.asList(fooMediaType, barMediaType)); + Flux source = Flux.just( + new Pojo("foo", "bar"), + new Pojo("foofoo", "barbar"), + new Pojo("foofoofoo", "barbarbar") + ); + ResolvableType type = ResolvableType.forClass(Pojo.class); + Flux output = this.encoder.encode(source, this.bufferFactory, type, barMediaType, emptyMap()); + + StepVerifier.create(output) + .consumeNextWith(stringConsumer("{\"foo\":\"foo\",\"bar\":\"bar\"}\n")) + .consumeNextWith(stringConsumer("{\"foo\":\"foofoo\",\"bar\":\"barbar\"}\n")) + .consumeNextWith(stringConsumer("{\"foo\":\"foofoofoo\",\"bar\":\"barbarbar\"}\n")) + .verifyComplete(); + } + @Test public void fieldLevelJsonView() throws Exception { JacksonViewBean bean = new JacksonViewBean();