Stream custom types in Jackson2JsonEncoder

Issue: SPR-15727
This commit is contained in:
Sebastien Deleuze 2017-07-03 10:13:56 +02:00
parent 9901c38f9d
commit 727ca4514a
2 changed files with 23 additions and 1 deletions

View File

@ -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'});

View File

@ -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<Pojo> source = Flux.just(
new Pojo("foo", "bar"),
new Pojo("foofoo", "barbar"),
new Pojo("foofoofoo", "barbarbar")
);
ResolvableType type = ResolvableType.forClass(Pojo.class);
Flux<DataBuffer> 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();