String encoding for any MIME type
CharSequenceEncoder now supports all MIME types, however since encoding Flux<String> can overlap with other encoders (e.g. SSE) there are now two ways to create a CharSequenceEncoder -- with support for text/plain only or with support for any MIME type. In WebFlux configuration we insert one CharSequenceEncoder for text/plain (as we have so far) and a second instance with support for any MIME type at the very end. Issue: SPR-15374
This commit is contained in:
parent
2896c5d2ab
commit
3d68c496f1
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2016 the original author or authors.
|
* Copyright 2002-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -29,12 +29,14 @@ import org.springframework.core.ResolvableType;
|
||||||
import org.springframework.core.io.buffer.DataBuffer;
|
import org.springframework.core.io.buffer.DataBuffer;
|
||||||
import org.springframework.core.io.buffer.DataBufferFactory;
|
import org.springframework.core.io.buffer.DataBufferFactory;
|
||||||
import org.springframework.util.MimeType;
|
import org.springframework.util.MimeType;
|
||||||
|
import org.springframework.util.MimeTypeUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encode from a {@code CharSequence} stream to a bytes stream.
|
* Encode from a {@code CharSequence} stream to a bytes stream.
|
||||||
*
|
*
|
||||||
* @author Sebastien Deleuze
|
* @author Sebastien Deleuze
|
||||||
* @author Arjen Poutsma
|
* @author Arjen Poutsma
|
||||||
|
* @author Rossen Stoyanchev
|
||||||
* @since 5.0
|
* @since 5.0
|
||||||
* @see StringDecoder
|
* @see StringDecoder
|
||||||
*/
|
*/
|
||||||
|
|
@ -43,8 +45,8 @@ public class CharSequenceEncoder extends AbstractEncoder<CharSequence> {
|
||||||
public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
|
public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
|
||||||
|
|
||||||
|
|
||||||
public CharSequenceEncoder() {
|
private CharSequenceEncoder(MimeType... mimeTypes) {
|
||||||
super(new MimeType("text", "plain", DEFAULT_CHARSET));
|
super(mimeTypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -73,4 +75,19 @@ public class CharSequenceEncoder extends AbstractEncoder<CharSequence> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a {@code CharSequenceEncoder} that supports only "text/plain".
|
||||||
|
*/
|
||||||
|
public static CharSequenceEncoder textPlainOnly() {
|
||||||
|
return new CharSequenceEncoder(new MimeType("text", "plain", DEFAULT_CHARSET));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a {@code CharSequenceEncoder} that supports all MIME types.
|
||||||
|
*/
|
||||||
|
public static CharSequenceEncoder allMimeTypes() {
|
||||||
|
return new CharSequenceEncoder(new MimeType("text", "plain", DEFAULT_CHARSET), MimeTypeUtils.ALL);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ public class CharSequenceEncoderTests extends AbstractDataBufferAllocatingTestCa
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void createEncoder() {
|
public void createEncoder() {
|
||||||
this.encoder = new CharSequenceEncoder();
|
this.encoder = CharSequenceEncoder.textPlainOnly();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,6 @@ import org.springframework.core.io.buffer.DataBufferUtils;
|
||||||
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
|
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.http.ReactiveHttpInputMessage;
|
import org.springframework.http.ReactiveHttpInputMessage;
|
||||||
import org.springframework.util.Assert;
|
|
||||||
|
|
||||||
import static java.util.stream.Collectors.joining;
|
import static java.util.stream.Collectors.joining;
|
||||||
|
|
||||||
|
|
@ -63,10 +62,18 @@ public class ServerSentEventHttpMessageReader implements HttpMessageReader<Objec
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor with JSON {@code Encoder} for encoding objects.
|
* Constructor without a {@code Decoder}. In this mode only {@code String}
|
||||||
|
* is supported as the data of an event.
|
||||||
|
*/
|
||||||
|
public ServerSentEventHttpMessageReader() {
|
||||||
|
this(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor with JSON {@code Decoder} for decoding to Objects. Support
|
||||||
|
* for decoding to {@code String} event data is built-in.
|
||||||
*/
|
*/
|
||||||
public ServerSentEventHttpMessageReader(Decoder<?> decoder) {
|
public ServerSentEventHttpMessageReader(Decoder<?> decoder) {
|
||||||
Assert.notNull(decoder, "Decoder must not be null");
|
|
||||||
this.decoder = decoder;
|
this.decoder = decoder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -85,7 +92,7 @@ public class ServerSentEventHttpMessageReader implements HttpMessageReader<Objec
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canRead(ResolvableType elementType, MediaType mediaType) {
|
public boolean canRead(ResolvableType elementType, MediaType mediaType) {
|
||||||
return MediaType.TEXT_EVENT_STREAM.isCompatibleWith(mediaType) ||
|
return MediaType.TEXT_EVENT_STREAM.includes(mediaType) ||
|
||||||
ServerSentEvent.class.isAssignableFrom(elementType.getRawClass());
|
ServerSentEvent.class.isAssignableFrom(elementType.getRawClass());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -183,8 +190,6 @@ public class ServerSentEventHttpMessageReader implements HttpMessageReader<Objec
|
||||||
public Mono<Object> readMono(ResolvableType elementType, ReactiveHttpInputMessage message,
|
public Mono<Object> readMono(ResolvableType elementType, ReactiveHttpInputMessage message,
|
||||||
Map<String, Object> hints) {
|
Map<String, Object> hints) {
|
||||||
|
|
||||||
// For single String give StringDecoder a chance which comes after SSE in the order
|
|
||||||
|
|
||||||
if (String.class.equals(elementType.getRawClass())) {
|
if (String.class.equals(elementType.getRawClass())) {
|
||||||
Flux<DataBuffer> body = message.getBody();
|
Flux<DataBuffer> body = message.getBody();
|
||||||
return stringDecoder.decodeToMono(body, elementType, null, null).cast(Object.class);
|
return stringDecoder.decodeToMono(body, elementType, null, null).cast(Object.class);
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@ import reactor.core.publisher.Flux;
|
||||||
import reactor.core.publisher.Mono;
|
import reactor.core.publisher.Mono;
|
||||||
|
|
||||||
import org.springframework.core.ResolvableType;
|
import org.springframework.core.ResolvableType;
|
||||||
|
import org.springframework.core.codec.CodecException;
|
||||||
import org.springframework.core.codec.Encoder;
|
import org.springframework.core.codec.Encoder;
|
||||||
import org.springframework.core.io.buffer.DataBuffer;
|
import org.springframework.core.io.buffer.DataBuffer;
|
||||||
import org.springframework.core.io.buffer.DataBufferFactory;
|
import org.springframework.core.io.buffer.DataBufferFactory;
|
||||||
|
|
@ -34,7 +35,6 @@ import org.springframework.http.MediaType;
|
||||||
import org.springframework.http.ReactiveHttpOutputMessage;
|
import org.springframework.http.ReactiveHttpOutputMessage;
|
||||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||||
import org.springframework.http.server.reactive.ServerHttpResponse;
|
import org.springframework.http.server.reactive.ServerHttpResponse;
|
||||||
import org.springframework.util.Assert;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@code ServerHttpMessageWriter} for {@code "text/event-stream"} responses.
|
* {@code ServerHttpMessageWriter} for {@code "text/event-stream"} responses.
|
||||||
|
|
@ -53,18 +53,25 @@ public class ServerSentEventHttpMessageWriter implements ServerHttpMessageWriter
|
||||||
private final Encoder<?> encoder;
|
private final Encoder<?> encoder;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor without an {@code Encoder}. In this mode only {@code String}
|
||||||
|
* is supported for event data to be encoded.
|
||||||
|
*/
|
||||||
|
public ServerSentEventHttpMessageWriter() {
|
||||||
|
this(null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor with JSON {@code Encoder} for encoding objects. Support for
|
* Constructor with JSON {@code Encoder} for encoding objects. Support for
|
||||||
* {@code String} event data is built-in.
|
* {@code String} event data is built-in.
|
||||||
*/
|
*/
|
||||||
public ServerSentEventHttpMessageWriter(Encoder<?> encoder) {
|
public ServerSentEventHttpMessageWriter(Encoder<?> encoder) {
|
||||||
Assert.notNull(encoder, "'encoder' must not be null");
|
|
||||||
this.encoder = encoder;
|
this.encoder = encoder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the configured {@code Encoder}.
|
* Return the configured {@code Encoder}, possibly {@code null}.
|
||||||
*/
|
*/
|
||||||
public Encoder<?> getEncoder() {
|
public Encoder<?> getEncoder() {
|
||||||
return this.encoder;
|
return this.encoder;
|
||||||
|
|
@ -78,7 +85,7 @@ public class ServerSentEventHttpMessageWriter implements ServerHttpMessageWriter
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canWrite(ResolvableType elementType, MediaType mediaType) {
|
public boolean canWrite(ResolvableType elementType, MediaType mediaType) {
|
||||||
return mediaType == null || MediaType.TEXT_EVENT_STREAM.isCompatibleWith(mediaType) ||
|
return mediaType == null || MediaType.TEXT_EVENT_STREAM.includes(mediaType) ||
|
||||||
ServerSentEvent.class.isAssignableFrom(elementType.getRawClass());
|
ServerSentEvent.class.isAssignableFrom(elementType.getRawClass());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -135,6 +142,10 @@ public class ServerSentEventHttpMessageWriter implements ServerHttpMessageWriter
|
||||||
return Flux.from(encodeText(text.replaceAll("\\n", "\ndata:") + "\n", factory));
|
return Flux.from(encodeText(text.replaceAll("\\n", "\ndata:") + "\n", factory));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.encoder == null) {
|
||||||
|
return Flux.error(new CodecException("No SSE encoder configured and the data is not String."));
|
||||||
|
}
|
||||||
|
|
||||||
return ((Encoder<T>) this.encoder)
|
return ((Encoder<T>) this.encoder)
|
||||||
.encode(Mono.just((T) data), factory, valueType, MediaType.TEXT_EVENT_STREAM, hints)
|
.encode(Mono.just((T) data), factory, valueType, MediaType.TEXT_EVENT_STREAM, hints)
|
||||||
.concatWith(encodeText("\n", factory));
|
.concatWith(encodeText("\n", factory));
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ import org.springframework.core.codec.ByteBufferEncoder;
|
||||||
import org.springframework.core.codec.CharSequenceEncoder;
|
import org.springframework.core.codec.CharSequenceEncoder;
|
||||||
import org.springframework.core.codec.DataBufferDecoder;
|
import org.springframework.core.codec.DataBufferDecoder;
|
||||||
import org.springframework.core.codec.DataBufferEncoder;
|
import org.springframework.core.codec.DataBufferEncoder;
|
||||||
|
import org.springframework.core.codec.Encoder;
|
||||||
import org.springframework.core.codec.ResourceDecoder;
|
import org.springframework.core.codec.ResourceDecoder;
|
||||||
import org.springframework.core.codec.StringDecoder;
|
import org.springframework.core.codec.StringDecoder;
|
||||||
import org.springframework.core.convert.converter.Converter;
|
import org.springframework.core.convert.converter.Converter;
|
||||||
|
|
@ -469,6 +470,7 @@ public class WebFluxConfigurationSupport implements ApplicationContextAware {
|
||||||
*/
|
*/
|
||||||
protected void configureMessageWriters(List<ServerHttpMessageWriter<?>> messageWriters) {
|
protected void configureMessageWriters(List<ServerHttpMessageWriter<?>> messageWriters) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds default converters that sub-classes can call from
|
* Adds default converters that sub-classes can call from
|
||||||
* {@link #configureMessageWriters(List)}.
|
* {@link #configureMessageWriters(List)}.
|
||||||
|
|
@ -477,15 +479,24 @@ public class WebFluxConfigurationSupport implements ApplicationContextAware {
|
||||||
writers.add(new EncoderHttpMessageWriter<>(new ByteArrayEncoder()));
|
writers.add(new EncoderHttpMessageWriter<>(new ByteArrayEncoder()));
|
||||||
writers.add(new EncoderHttpMessageWriter<>(new ByteBufferEncoder()));
|
writers.add(new EncoderHttpMessageWriter<>(new ByteBufferEncoder()));
|
||||||
writers.add(new EncoderHttpMessageWriter<>(new DataBufferEncoder()));
|
writers.add(new EncoderHttpMessageWriter<>(new DataBufferEncoder()));
|
||||||
writers.add(new EncoderHttpMessageWriter<>(new CharSequenceEncoder()));
|
writers.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.textPlainOnly()));
|
||||||
writers.add(new ResourceHttpMessageWriter());
|
writers.add(new ResourceHttpMessageWriter());
|
||||||
if (jaxb2Present) {
|
if (jaxb2Present) {
|
||||||
writers.add(new EncoderHttpMessageWriter<>(new Jaxb2XmlEncoder()));
|
writers.add(new EncoderHttpMessageWriter<>(new Jaxb2XmlEncoder()));
|
||||||
}
|
}
|
||||||
if (jackson2Present) {
|
if (jackson2Present) {
|
||||||
Jackson2JsonEncoder jacksonEncoder = new Jackson2JsonEncoder();
|
writers.add(new EncoderHttpMessageWriter<>(new Jackson2JsonEncoder()));
|
||||||
writers.add(new EncoderHttpMessageWriter<>(jacksonEncoder));
|
}
|
||||||
writers.add(new ServerSentEventHttpMessageWriter(jacksonEncoder));
|
writers.add(new ServerSentEventHttpMessageWriter(getSseEncoder()));
|
||||||
|
writers.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.allMimeTypes()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Encoder<?> getSseEncoder() {
|
||||||
|
if (jackson2Present) {
|
||||||
|
return new Jackson2JsonEncoder();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -75,12 +75,10 @@ class DefaultExchangeStrategiesBuilder implements ExchangeStrategies.Builder {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void defaultReaders() {
|
private void defaultReaders() {
|
||||||
|
// SSE first (constrained to "text/event-stream")
|
||||||
|
messageReader(new ServerSentEventHttpMessageReader(getSseDecoder()));
|
||||||
messageReader(new DecoderHttpMessageReader<>(new ByteArrayDecoder()));
|
messageReader(new DecoderHttpMessageReader<>(new ByteArrayDecoder()));
|
||||||
messageReader(new DecoderHttpMessageReader<>(new ByteBufferDecoder()));
|
messageReader(new DecoderHttpMessageReader<>(new ByteBufferDecoder()));
|
||||||
if (jackson2Present) {
|
|
||||||
// SSE ahead of String e.g. "test/event-stream" + Flux<String>
|
|
||||||
messageReader(new ServerSentEventHttpMessageReader(new Jackson2JsonDecoder()));
|
|
||||||
}
|
|
||||||
messageReader(new DecoderHttpMessageReader<>(new StringDecoder(false)));
|
messageReader(new DecoderHttpMessageReader<>(new StringDecoder(false)));
|
||||||
if (jaxb2Present) {
|
if (jaxb2Present) {
|
||||||
messageReader(new DecoderHttpMessageReader<>(new Jaxb2XmlDecoder()));
|
messageReader(new DecoderHttpMessageReader<>(new Jaxb2XmlDecoder()));
|
||||||
|
|
@ -90,10 +88,19 @@ class DefaultExchangeStrategiesBuilder implements ExchangeStrategies.Builder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Decoder<?> getSseDecoder() {
|
||||||
|
if (jackson2Present) {
|
||||||
|
return new Jackson2JsonDecoder();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void defaultWriters() {
|
private void defaultWriters() {
|
||||||
messageWriter(new EncoderHttpMessageWriter<>(new ByteArrayEncoder()));
|
messageWriter(new EncoderHttpMessageWriter<>(new ByteArrayEncoder()));
|
||||||
messageWriter(new EncoderHttpMessageWriter<>(new ByteBufferEncoder()));
|
messageWriter(new EncoderHttpMessageWriter<>(new ByteBufferEncoder()));
|
||||||
messageWriter(new EncoderHttpMessageWriter<>(new CharSequenceEncoder()));
|
messageWriter(new EncoderHttpMessageWriter<>(CharSequenceEncoder.allMimeTypes()));
|
||||||
messageWriter(new ResourceHttpMessageWriter());
|
messageWriter(new ResourceHttpMessageWriter());
|
||||||
messageWriter(new FormHttpMessageWriter());
|
messageWriter(new FormHttpMessageWriter());
|
||||||
if (jaxb2Present) {
|
if (jaxb2Present) {
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ import org.springframework.core.codec.ByteArrayEncoder;
|
||||||
import org.springframework.core.codec.ByteBufferDecoder;
|
import org.springframework.core.codec.ByteBufferDecoder;
|
||||||
import org.springframework.core.codec.ByteBufferEncoder;
|
import org.springframework.core.codec.ByteBufferEncoder;
|
||||||
import org.springframework.core.codec.CharSequenceEncoder;
|
import org.springframework.core.codec.CharSequenceEncoder;
|
||||||
|
import org.springframework.core.codec.Encoder;
|
||||||
import org.springframework.core.codec.StringDecoder;
|
import org.springframework.core.codec.StringDecoder;
|
||||||
import org.springframework.http.codec.DecoderHttpMessageReader;
|
import org.springframework.http.codec.DecoderHttpMessageReader;
|
||||||
import org.springframework.http.codec.EncoderHttpMessageWriter;
|
import org.springframework.http.codec.EncoderHttpMessageWriter;
|
||||||
|
|
@ -88,7 +89,7 @@ class DefaultHandlerStrategiesBuilder implements HandlerStrategies.Builder {
|
||||||
|
|
||||||
messageWriter(new EncoderHttpMessageWriter<>(new ByteArrayEncoder()));
|
messageWriter(new EncoderHttpMessageWriter<>(new ByteArrayEncoder()));
|
||||||
messageWriter(new EncoderHttpMessageWriter<>(new ByteBufferEncoder()));
|
messageWriter(new EncoderHttpMessageWriter<>(new ByteBufferEncoder()));
|
||||||
messageWriter(new EncoderHttpMessageWriter<>(new CharSequenceEncoder()));
|
messageWriter(new EncoderHttpMessageWriter<>(CharSequenceEncoder.textPlainOnly()));
|
||||||
messageWriter(new ResourceHttpMessageWriter());
|
messageWriter(new ResourceHttpMessageWriter());
|
||||||
|
|
||||||
if (jaxb2Present) {
|
if (jaxb2Present) {
|
||||||
|
|
@ -97,13 +98,24 @@ class DefaultHandlerStrategiesBuilder implements HandlerStrategies.Builder {
|
||||||
}
|
}
|
||||||
if (jackson2Present) {
|
if (jackson2Present) {
|
||||||
messageReader(new DecoderHttpMessageReader<>(new Jackson2JsonDecoder()));
|
messageReader(new DecoderHttpMessageReader<>(new Jackson2JsonDecoder()));
|
||||||
Jackson2JsonEncoder jsonEncoder = new Jackson2JsonEncoder();
|
messageWriter(new EncoderHttpMessageWriter<>(new Jackson2JsonEncoder()));
|
||||||
messageWriter(new EncoderHttpMessageWriter<>(jsonEncoder));
|
|
||||||
messageWriter(new ServerSentEventHttpMessageWriter(jsonEncoder));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
messageWriter(new ServerSentEventHttpMessageWriter(getSseEncoder()));
|
||||||
|
messageWriter(new EncoderHttpMessageWriter<>(CharSequenceEncoder.allMimeTypes()));
|
||||||
|
|
||||||
localeResolver(DEFAULT_LOCALE_RESOLVER);
|
localeResolver(DEFAULT_LOCALE_RESOLVER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Encoder<?> getSseEncoder() {
|
||||||
|
if (jackson2Present) {
|
||||||
|
return new Jackson2JsonEncoder();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void applicationContext(ApplicationContext applicationContext) {
|
public void applicationContext(ApplicationContext applicationContext) {
|
||||||
applicationContext.getBeansOfType(HttpMessageReader.class).values().forEach(this::messageReader);
|
applicationContext.getBeansOfType(HttpMessageReader.class).values().forEach(this::messageReader);
|
||||||
applicationContext.getBeansOfType(HttpMessageWriter.class).values().forEach(this::messageWriter);
|
applicationContext.getBeansOfType(HttpMessageWriter.class).values().forEach(this::messageWriter);
|
||||||
|
|
|
||||||
|
|
@ -186,8 +186,8 @@ public class DispatcherHandlerErrorTests {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public ResponseBodyResultHandler resultHandler() {
|
public ResponseBodyResultHandler resultHandler() {
|
||||||
return new ResponseBodyResultHandler(
|
return new ResponseBodyResultHandler(Collections.singletonList(
|
||||||
Collections.singletonList(new EncoderHttpMessageWriter<>(new CharSequenceEncoder())),
|
new EncoderHttpMessageWriter<>(CharSequenceEncoder.textPlainOnly())),
|
||||||
new HeaderContentTypeResolver());
|
new HeaderContentTypeResolver());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -178,7 +178,7 @@ public class WebFluxConfigurationSupportTests {
|
||||||
assertEquals(0, handler.getOrder());
|
assertEquals(0, handler.getOrder());
|
||||||
|
|
||||||
List<ServerHttpMessageWriter<?>> writers = handler.getMessageWriters();
|
List<ServerHttpMessageWriter<?>> writers = handler.getMessageWriters();
|
||||||
assertEquals(8, writers.size());
|
assertEquals(9, writers.size());
|
||||||
|
|
||||||
assertHasMessageWriter(writers, byte[].class, APPLICATION_OCTET_STREAM);
|
assertHasMessageWriter(writers, byte[].class, APPLICATION_OCTET_STREAM);
|
||||||
assertHasMessageWriter(writers, ByteBuffer.class, APPLICATION_OCTET_STREAM);
|
assertHasMessageWriter(writers, ByteBuffer.class, APPLICATION_OCTET_STREAM);
|
||||||
|
|
@ -204,7 +204,7 @@ public class WebFluxConfigurationSupportTests {
|
||||||
assertEquals(100, handler.getOrder());
|
assertEquals(100, handler.getOrder());
|
||||||
|
|
||||||
List<ServerHttpMessageWriter<?>> writers = handler.getMessageWriters();
|
List<ServerHttpMessageWriter<?>> writers = handler.getMessageWriters();
|
||||||
assertEquals(8, writers.size());
|
assertEquals(9, writers.size());
|
||||||
|
|
||||||
assertHasMessageWriter(writers, byte[].class, APPLICATION_OCTET_STREAM);
|
assertHasMessageWriter(writers, byte[].class, APPLICATION_OCTET_STREAM);
|
||||||
assertHasMessageWriter(writers, ByteBuffer.class, APPLICATION_OCTET_STREAM);
|
assertHasMessageWriter(writers, ByteBuffer.class, APPLICATION_OCTET_STREAM);
|
||||||
|
|
@ -303,7 +303,7 @@ public class WebFluxConfigurationSupportTests {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void configureMessageWriters(List<ServerHttpMessageWriter<?>> messageWriters) {
|
protected void configureMessageWriters(List<ServerHttpMessageWriter<?>> messageWriters) {
|
||||||
messageWriters.add(new EncoderHttpMessageWriter<>(new CharSequenceEncoder()));
|
messageWriters.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.textPlainOnly()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -77,13 +77,14 @@ public class BodyInsertersTests {
|
||||||
public void createContext() {
|
public void createContext() {
|
||||||
final List<HttpMessageWriter<?>> messageWriters = new ArrayList<>();
|
final List<HttpMessageWriter<?>> messageWriters = new ArrayList<>();
|
||||||
messageWriters.add(new EncoderHttpMessageWriter<>(new ByteBufferEncoder()));
|
messageWriters.add(new EncoderHttpMessageWriter<>(new ByteBufferEncoder()));
|
||||||
messageWriters.add(new EncoderHttpMessageWriter<>(new CharSequenceEncoder()));
|
messageWriters.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.textPlainOnly()));
|
||||||
messageWriters.add(new ResourceHttpMessageWriter());
|
messageWriters.add(new ResourceHttpMessageWriter());
|
||||||
messageWriters.add(new EncoderHttpMessageWriter<>(new Jaxb2XmlEncoder()));
|
messageWriters.add(new EncoderHttpMessageWriter<>(new Jaxb2XmlEncoder()));
|
||||||
Jackson2JsonEncoder jsonEncoder = new Jackson2JsonEncoder();
|
Jackson2JsonEncoder jsonEncoder = new Jackson2JsonEncoder();
|
||||||
messageWriters.add(new EncoderHttpMessageWriter<>(jsonEncoder));
|
messageWriters.add(new EncoderHttpMessageWriter<>(jsonEncoder));
|
||||||
messageWriters.add(new ServerSentEventHttpMessageWriter(jsonEncoder));
|
messageWriters.add(new ServerSentEventHttpMessageWriter(jsonEncoder));
|
||||||
messageWriters.add(new FormHttpMessageWriter());
|
messageWriters.add(new FormHttpMessageWriter());
|
||||||
|
messageWriters.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.allMimeTypes()));
|
||||||
|
|
||||||
this.context = new BodyInserter.Context() {
|
this.context = new BodyInserter.Context() {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -104,7 +104,7 @@ public class DefaultClientRequestBuilderTests {
|
||||||
.body(inserter).build();
|
.body(inserter).build();
|
||||||
|
|
||||||
List<HttpMessageWriter<?>> messageWriters = new ArrayList<>();
|
List<HttpMessageWriter<?>> messageWriters = new ArrayList<>();
|
||||||
messageWriters.add(new EncoderHttpMessageWriter<>(new CharSequenceEncoder()));
|
messageWriters.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.allMimeTypes()));
|
||||||
|
|
||||||
ExchangeStrategies strategies = mock(ExchangeStrategies.class);
|
ExchangeStrategies strategies = mock(ExchangeStrategies.class);
|
||||||
when(strategies.messageWriters()).thenReturn(messageWriters::stream);
|
when(strategies.messageWriters()).thenReturn(messageWriters::stream);
|
||||||
|
|
|
||||||
|
|
@ -191,7 +191,9 @@ public class DefaultEntityResponseBuilderTests {
|
||||||
|
|
||||||
MockServerWebExchange exchange = MockServerHttpRequest.get("http://localhost").toExchange();
|
MockServerWebExchange exchange = MockServerHttpRequest.get("http://localhost").toExchange();
|
||||||
|
|
||||||
HandlerStrategies strategies = HandlerStrategies.empty().messageWriter(new EncoderHttpMessageWriter<>(new CharSequenceEncoder())).build();
|
HandlerStrategies strategies = HandlerStrategies.empty()
|
||||||
|
.messageWriter(new EncoderHttpMessageWriter<>(CharSequenceEncoder.allMimeTypes()))
|
||||||
|
.build();
|
||||||
|
|
||||||
StepVerifier.create(result)
|
StepVerifier.create(result)
|
||||||
.consumeNextWith(response -> {
|
.consumeNextWith(response -> {
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ public class MessageWriterResultHandlerTests {
|
||||||
if (ObjectUtils.isEmpty(writers)) {
|
if (ObjectUtils.isEmpty(writers)) {
|
||||||
writerList = new ArrayList<>();
|
writerList = new ArrayList<>();
|
||||||
writerList.add(new EncoderHttpMessageWriter<>(new ByteBufferEncoder()));
|
writerList.add(new EncoderHttpMessageWriter<>(new ByteBufferEncoder()));
|
||||||
writerList.add(new EncoderHttpMessageWriter<>(new CharSequenceEncoder()));
|
writerList.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.allMimeTypes()));
|
||||||
writerList.add(new ResourceHttpMessageWriter());
|
writerList.add(new ResourceHttpMessageWriter());
|
||||||
writerList.add(new EncoderHttpMessageWriter<>(new Jaxb2XmlEncoder()));
|
writerList.add(new EncoderHttpMessageWriter<>(new Jaxb2XmlEncoder()));
|
||||||
writerList.add(new EncoderHttpMessageWriter<>(new Jackson2JsonEncoder()));
|
writerList.add(new EncoderHttpMessageWriter<>(new Jackson2JsonEncoder()));
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ public class ResponseBodyResultHandlerTests {
|
||||||
public void setup() throws Exception {
|
public void setup() throws Exception {
|
||||||
List<ServerHttpMessageWriter<?>> writerList = new ArrayList<>(5);
|
List<ServerHttpMessageWriter<?>> writerList = new ArrayList<>(5);
|
||||||
writerList.add(new EncoderHttpMessageWriter<>(new ByteBufferEncoder()));
|
writerList.add(new EncoderHttpMessageWriter<>(new ByteBufferEncoder()));
|
||||||
writerList.add(new EncoderHttpMessageWriter<>(new CharSequenceEncoder()));
|
writerList.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.allMimeTypes()));
|
||||||
writerList.add(new ResourceHttpMessageWriter());
|
writerList.add(new ResourceHttpMessageWriter());
|
||||||
writerList.add(new EncoderHttpMessageWriter<>(new Jaxb2XmlEncoder()));
|
writerList.add(new EncoderHttpMessageWriter<>(new Jaxb2XmlEncoder()));
|
||||||
writerList.add(new EncoderHttpMessageWriter<>(new Jackson2JsonEncoder()));
|
writerList.add(new EncoderHttpMessageWriter<>(new Jackson2JsonEncoder()));
|
||||||
|
|
|
||||||
|
|
@ -88,10 +88,11 @@ public class ResponseEntityResultHandlerTests {
|
||||||
if (ObjectUtils.isEmpty(writers)) {
|
if (ObjectUtils.isEmpty(writers)) {
|
||||||
writerList = new ArrayList<>();
|
writerList = new ArrayList<>();
|
||||||
writerList.add(new EncoderHttpMessageWriter<>(new ByteBufferEncoder()));
|
writerList.add(new EncoderHttpMessageWriter<>(new ByteBufferEncoder()));
|
||||||
writerList.add(new EncoderHttpMessageWriter<>(new CharSequenceEncoder()));
|
writerList.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.textPlainOnly()));
|
||||||
writerList.add(new ResourceHttpMessageWriter());
|
writerList.add(new ResourceHttpMessageWriter());
|
||||||
writerList.add(new EncoderHttpMessageWriter<>(new Jaxb2XmlEncoder()));
|
writerList.add(new EncoderHttpMessageWriter<>(new Jaxb2XmlEncoder()));
|
||||||
writerList.add(new EncoderHttpMessageWriter<>(new Jackson2JsonEncoder()));
|
writerList.add(new EncoderHttpMessageWriter<>(new Jackson2JsonEncoder()));
|
||||||
|
writerList.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.allMimeTypes()));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
writerList = Arrays.asList(writers);
|
writerList = Arrays.asList(writers);
|
||||||
|
|
|
||||||
|
|
@ -104,7 +104,7 @@ public class HttpMessageWriterViewTests {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void extractObjectMultipleMatchesNotSupported() throws Exception {
|
public void extractObjectMultipleMatchesNotSupported() throws Exception {
|
||||||
HttpMessageWriterView view = new HttpMessageWriterView(new CharSequenceEncoder());
|
HttpMessageWriterView view = new HttpMessageWriterView(CharSequenceEncoder.allMimeTypes());
|
||||||
view.setModelKeys(new HashSet<>(Arrays.asList("foo1", "foo2")));
|
view.setModelKeys(new HashSet<>(Arrays.asList("foo1", "foo2")));
|
||||||
this.model.addAttribute("foo1", "bar1");
|
this.model.addAttribute("foo1", "bar1");
|
||||||
this.model.addAttribute("foo2", "bar2");
|
this.model.addAttribute("foo2", "bar2");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue