Refactor DefaultCodecs implementation

Simplify the internals of the DefaultCodecs implementation favoring
explicit fields per override vs a generic list of readers and writers
for overrides.
This commit is contained in:
Rossen Stoyanchev 2017-05-27 14:21:12 -04:00
parent 1328c8f46e
commit 03b344b579
7 changed files with 199 additions and 253 deletions

View File

@ -16,10 +16,8 @@
package org.springframework.http.codec;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
import org.springframework.core.ResolvableType;
import org.springframework.core.codec.ByteArrayDecoder;
@ -32,6 +30,7 @@ import org.springframework.core.codec.DataBufferEncoder;
import org.springframework.core.codec.Decoder;
import org.springframework.core.codec.Encoder;
import org.springframework.core.codec.ResourceDecoder;
import org.springframework.core.codec.StringDecoder;
import org.springframework.http.codec.json.Jackson2JsonDecoder;
import org.springframework.http.codec.json.Jackson2JsonEncoder;
import org.springframework.http.codec.xml.Jaxb2XmlDecoder;
@ -39,6 +38,7 @@ import org.springframework.http.codec.xml.Jaxb2XmlEncoder;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
/**
* Default implementation of {@link CodecConfigurer}.
*
@ -62,9 +62,6 @@ abstract class AbstractCodecConfigurer implements CodecConfigurer {
private final DefaultCustomCodecs customCodecs = new DefaultCustomCodecs();
/**
* Protected constructor with the configurer for default readers and writers.
*/
protected AbstractCodecConfigurer(AbstractDefaultCodecs defaultCodecs) {
Assert.notNull(defaultCodecs, "'defaultCodecs' is required.");
this.defaultCodecs = defaultCodecs;
@ -77,8 +74,8 @@ abstract class AbstractCodecConfigurer implements CodecConfigurer {
}
@Override
public void registerDefaults(boolean registerDefaults) {
this.defaultCodecs.setSuppressed(!registerDefaults);
public void registerDefaults(boolean shouldRegister) {
this.defaultCodecs.setRegisterDefaults(shouldRegister);
}
@Override
@ -86,197 +83,156 @@ abstract class AbstractCodecConfigurer implements CodecConfigurer {
return this.customCodecs;
}
@Override
public List<HttpMessageReader<?>> getReaders() {
List<HttpMessageReader<?>> result = new ArrayList<>();
this.defaultCodecs.addTypedReadersTo(result);
this.customCodecs.addTypedReadersTo(result);
result.addAll(this.defaultCodecs.getTypedReaders());
result.addAll(this.customCodecs.getTypedReaders());
this.defaultCodecs.addObjectReadersTo(result);
this.customCodecs.addObjectReadersTo(result);
result.addAll(this.defaultCodecs.getObjectReaders());
result.addAll(this.customCodecs.getObjectReaders());
// String + "*/*"
this.defaultCodecs.addStringReaderTo(result);
result.addAll(this.defaultCodecs.getCatchAllReaders());
return result;
}
/**
* Prepare a list of HTTP message writers.
*/
@Override
public List<HttpMessageWriter<?>> getWriters() {
List<HttpMessageWriter<?>> result = new ArrayList<>();
this.defaultCodecs.addTypedWritersTo(result);
this.customCodecs.addTypedWritersTo(result);
result.addAll(this.defaultCodecs.getTypedWriters());
result.addAll(this.customCodecs.getTypedWriters());
this.defaultCodecs.addObjectWritersTo(result);
this.customCodecs.addObjectWritersTo(result);
result.addAll(this.defaultCodecs.getObjectWriters());
result.addAll(this.customCodecs.getObjectWriters());
// String + "*/*"
this.defaultCodecs.addStringWriterTo(result);
result.addAll(this.defaultCodecs.getCatchAllWriters());
return result;
}
/**
* Default implementation for {@link DefaultCodecs}.
*/
abstract static class AbstractDefaultCodecs implements DefaultCodecs {
private boolean suppressed = false;
private boolean registerDefaults = true;
private final Map<Class<?>, HttpMessageReader<?>> readers = new HashMap<>();
private Jackson2JsonDecoder jackson2Decoder;
private final Map<Class<?>, HttpMessageWriter<?>> writers = new HashMap<>();
private Jackson2JsonEncoder jackson2Encoder;
public void setRegisterDefaults(boolean registerDefaults) {
this.registerDefaults = registerDefaults;
}
public boolean shouldRegisterDefaults() {
return this.registerDefaults;
}
@Override
public void jackson2Decoder(Jackson2JsonDecoder decoder) {
this.readers.put(Jackson2JsonDecoder.class, new DecoderHttpMessageReader<>(decoder));
this.jackson2Decoder = decoder;
}
protected Jackson2JsonDecoder jackson2Decoder() {
return this.jackson2Decoder != null ? this.jackson2Decoder : new Jackson2JsonDecoder();
}
@Override
public void jackson2Encoder(Jackson2JsonEncoder encoder) {
this.writers.put(Jackson2JsonEncoder.class, new EncoderHttpMessageWriter<>(encoder));
this.jackson2Encoder = encoder;
}
public void addTypedReadersTo(List<HttpMessageReader<?>> result) {
addReaderTo(result, ByteArrayDecoder.class, ByteArrayDecoder::new);
addReaderTo(result, ByteBufferDecoder.class, ByteBufferDecoder::new);
addReaderTo(result, DataBufferDecoder.class, DataBufferDecoder::new);
addReaderTo(result, ResourceDecoder.class, ResourceDecoder::new);
addStringReaderTextOnlyTo(result);
protected Jackson2JsonEncoder jackson2Encoder() {
return this.jackson2Encoder != null ? this.jackson2Encoder : new Jackson2JsonEncoder();
}
protected void addTypedWritersTo(List<HttpMessageWriter<?>> result) {
addWriterTo(result, ByteArrayEncoder.class, ByteArrayEncoder::new);
addWriterTo(result, ByteBufferEncoder.class, ByteBufferEncoder::new);
addWriterTo(result, DataBufferEncoder.class, DataBufferEncoder::new);
addWriterTo(result, ResourceHttpMessageWriter::new);
addStringWriterTextPlainOnlyTo(result);
// Readers...
public List<HttpMessageReader<?>> getTypedReaders() {
if (!this.registerDefaults) {
return Collections.emptyList();
}
List<HttpMessageReader<?>> result = new ArrayList<>();
result.add(new DecoderHttpMessageReader<>(new ByteArrayDecoder()));
result.add(new DecoderHttpMessageReader<>(new ByteBufferDecoder()));
result.add(new DecoderHttpMessageReader<>(new DataBufferDecoder()));
result.add(new DecoderHttpMessageReader<>(new ResourceDecoder()));
result.add(new DecoderHttpMessageReader<>(StringDecoder.textPlainOnly(splitTextOnNewLine())));
return result;
}
protected abstract boolean splitTextOnNewLine();
protected void addObjectReadersTo(List<HttpMessageReader<?>> result) {
public List<HttpMessageReader<?>> getObjectReaders() {
if (!this.registerDefaults) {
return Collections.emptyList();
}
List<HttpMessageReader<?>> result = new ArrayList<>();
if (jaxb2Present) {
addReaderTo(result, Jaxb2XmlDecoder.class, Jaxb2XmlDecoder::new);
result.add(new DecoderHttpMessageReader<>(new Jaxb2XmlDecoder()));
}
if (jackson2Present) {
addReaderTo(result, Jackson2JsonDecoder.class, Jackson2JsonDecoder::new);
result.add(new DecoderHttpMessageReader<>(jackson2Decoder()));
}
return result;
}
protected void addObjectWritersTo(List<HttpMessageWriter<?>> result) {
public List<HttpMessageReader<?>> getCatchAllReaders() {
if (!this.registerDefaults) {
return Collections.emptyList();
}
List<HttpMessageReader<?>> result = new ArrayList<>();
result.add(new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(splitTextOnNewLine())));
return result;
}
// Writers...
public List<HttpMessageWriter<?>> getTypedWriters() {
if (!this.registerDefaults) {
return Collections.emptyList();
}
List<HttpMessageWriter<?>> result = new ArrayList<>();
result.add(new EncoderHttpMessageWriter<>(new ByteArrayEncoder()));
result.add(new EncoderHttpMessageWriter<>(new ByteBufferEncoder()));
result.add(new EncoderHttpMessageWriter<>(new DataBufferEncoder()));
result.add(new ResourceHttpMessageWriter());
result.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.textPlainOnly()));
return result;
}
public List<HttpMessageWriter<?>> getObjectWriters() {
if (!this.registerDefaults) {
return Collections.emptyList();
}
List<HttpMessageWriter<?>> result = new ArrayList<>();
if (jaxb2Present) {
addWriterTo(result, Jaxb2XmlEncoder.class, Jaxb2XmlEncoder::new);
result.add(new EncoderHttpMessageWriter<>(new Jaxb2XmlEncoder()));
}
if (jackson2Present) {
addWriterTo(result, Jackson2JsonEncoder.class, Jackson2JsonEncoder::new);
result.add(new EncoderHttpMessageWriter<>(jackson2Encoder()));
}
return result;
}
// Accessors for internal use...
protected Map<Class<?>, HttpMessageReader<?>> getReaders() {
return this.readers;
}
protected Map<Class<?>, HttpMessageWriter<?>> getWriters() {
return this.writers;
}
private void setSuppressed(boolean suppressed) {
this.suppressed = suppressed;
}
// Protected methods for building a list of default readers or writers...
protected <T, D extends Decoder<T>> void addReaderTo(List<HttpMessageReader<?>> result,
Class<D> key, Supplier<D> fallback) {
addReaderTo(result, () -> findDecoderReader(key, fallback));
}
protected void addReaderTo(List<HttpMessageReader<?>> result,
Supplier<HttpMessageReader<?>> reader) {
if (!this.suppressed) {
result.add(reader.get());
public List<HttpMessageWriter<?>> getCatchAllWriters() {
if (!this.registerDefaults) {
return Collections.emptyList();
}
}
protected <T, D extends Decoder<T>> DecoderHttpMessageReader<?> findDecoderReader(
Class<D> decoderType, Supplier<D> fallback) {
DecoderHttpMessageReader<?> reader = (DecoderHttpMessageReader<?>) this.readers.get(decoderType);
return reader != null ? reader : new DecoderHttpMessageReader<>(fallback.get());
}
@SuppressWarnings("unchecked")
protected HttpMessageReader<?> findReader(Class<?> key, Supplier<HttpMessageReader<?>> fallback) {
return this.readers.containsKey(key) ? this.readers.get(key) : fallback.get();
}
protected <T, E extends Encoder<T>> void addWriterTo(List<HttpMessageWriter<?>> result,
Class<E> key, Supplier<E> fallback) {
addWriterTo(result, () -> findEncoderWriter(key, fallback));
}
protected void addWriterTo(List<HttpMessageWriter<?>> result,
Supplier<HttpMessageWriter<?>> writer) {
if (!this.suppressed) {
result.add(writer.get());
}
}
protected <T, E extends Encoder<T>> EncoderHttpMessageWriter<?> findEncoderWriter(
Class<E> encoderType, Supplier<E> fallback) {
EncoderHttpMessageWriter<?> writer = (EncoderHttpMessageWriter<?>) this.writers.get(encoderType);
return writer != null ? writer : new EncoderHttpMessageWriter<>(fallback.get());
}
@SuppressWarnings("unchecked")
protected HttpMessageWriter<?> findWriter(Class<?> key, Supplier<HttpMessageWriter<?>> fallback) {
return this.writers.containsKey(key) ? this.writers.get(key) : fallback.get();
}
protected abstract void addStringReaderTextOnlyTo(List<HttpMessageReader<?>> result);
protected abstract void addStringReaderTo(List<HttpMessageReader<?>> result);
protected void addStringWriterTextPlainOnlyTo(List<HttpMessageWriter<?>> result) {
addWriterTo(result, () -> new EncoderHttpMessageWriter<>(CharSequenceEncoder.textPlainOnly()));
}
protected void addStringWriterTo(List<HttpMessageWriter<?>> result) {
addWriterTo(result, () -> new EncoderHttpMessageWriter<>(CharSequenceEncoder.allMimeTypes()));
List<HttpMessageWriter<?>> result = new ArrayList<>();
result.add(new EncoderHttpMessageWriter<>(CharSequenceEncoder.allMimeTypes()));
return result;
}
}
/**
* Default implementation of CustomCodecs.
*/
private static class DefaultCustomCodecs implements CustomCodecs {
private final List<HttpMessageReader<?>> typedReaders = new ArrayList<>();
private final List<HttpMessageWriter<?>> typedWriters = new ArrayList<>();
private final List<HttpMessageReader<?>> objectReaders = new ArrayList<>();
private final List<HttpMessageWriter<?>> objectWriters = new ArrayList<>();
@ -302,22 +258,22 @@ abstract class AbstractCodecConfigurer implements CodecConfigurer {
(canWriteObject ? this.objectWriters : this.typedWriters).add(writer);
}
// Internal methods for building a list of custom readers or writers...
protected void addTypedReadersTo(List<HttpMessageReader<?>> result) {
result.addAll(this.typedReaders);
public List<HttpMessageReader<?>> getTypedReaders() {
return this.typedReaders;
}
protected void addObjectReadersTo(List<HttpMessageReader<?>> result) {
result.addAll(this.objectReaders);
public List<HttpMessageWriter<?>> getTypedWriters() {
return this.typedWriters;
}
protected void addTypedWritersTo(List<HttpMessageWriter<?>> result) {
result.addAll(this.typedWriters);
public List<HttpMessageReader<?>> getObjectReaders() {
return this.objectReaders;
}
protected void addObjectWritersTo(List<HttpMessageWriter<?>> result) {
result.addAll(this.objectWriters);
public List<HttpMessageWriter<?>> getObjectWriters() {
return this.objectWriters;
}
}
}

View File

@ -35,10 +35,7 @@ import org.springframework.core.codec.Encoder;
*/
public interface ClientCodecConfigurer extends CodecConfigurer {
/**
* {@inheritDoc}
* <p>Overriden to return {@link ClientDefaultCodecs}.
*/
@Override
ClientDefaultCodecs defaultCodecs();
@ -51,8 +48,9 @@ public interface ClientCodecConfigurer extends CodecConfigurer {
return new DefaultClientCodecConfigurer();
}
/**
* Extension of {@link AbstractCodecConfigurer} with extra client options.
* Extension of {@link DefaultCodecs} with extra client options.
*/
interface ClientDefaultCodecs extends DefaultCodecs {
@ -65,7 +63,9 @@ public interface ClientCodecConfigurer extends CodecConfigurer {
/**
* Configure the {@code Decoder} to use for Server-Sent Events.
* <p>By default the {@link #jackson2Decoder} override is used for SSE.
* <p>By default if this is not set, and Jackson is available, the
* {@link #jackson2Decoder} override is used instead. Use this property
* if you want to further customize the SSE decoder.
* @param decoder the decoder to use
*/
void serverSentEventDecoder(Decoder<?> decoder);

View File

@ -35,48 +35,50 @@ import org.springframework.http.codec.json.Jackson2JsonEncoder;
public interface CodecConfigurer {
/**
* Provide overrides for built-in HTTP message readers or writers.
* Configure or customize the default HTTP message readers and writers.
*/
DefaultCodecs defaultCodecs();
/**
* Whether to make default HTTP message reader and writer registrations.
* <p>By default this is set to {@code "true"}.
* Whether to register default HTTP message readers and writers.
* <p>By default this is set to {@code "true"}; setting this to {@code false}
* disables default HTTP message reader and writer registrations.
*/
void registerDefaults(boolean registerDefaults);
/**
* Register a custom encoder or decoder.
* Register custom HTTP message readers or writers to use in addition to
* the ones registered by default.
*/
CustomCodecs customCodecs();
/**
* Prepare a list of HTTP message readers.
* Obtain the configured HTTP message readers.
*/
List<HttpMessageReader<?>> getReaders();
/**
* Prepare a list of HTTP message writers.
* Obtain the configured HTTP message writers.
*/
List<HttpMessageWriter<?>> getWriters();
/**
* Registry and container for built-in HTTP message readers and writers.
* Assists with customizing the default HTTP message readers and writers.
* @see ClientCodecConfigurer.ClientDefaultCodecs
* @see ServerCodecConfigurer.ServerDefaultCodecs
*/
interface DefaultCodecs {
/**
* Override the default Jackson {@code Decoder}.
* @param decoder the decoder to use
* Override the default Jackson JSON {@code Decoder}.
* @param decoder the decoder instance to use
*/
void jackson2Decoder(Jackson2JsonDecoder decoder);
/**
* Override the default Jackson {@code Encoder} for JSON.
* @param encoder the encoder to use
* Override the default Jackson JSON {@code Encoder}.
* @param encoder the encoder instance to use
*/
void jackson2Encoder(Jackson2JsonEncoder encoder);

View File

@ -17,12 +17,11 @@
package org.springframework.http.codec;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.springframework.core.codec.Decoder;
import org.springframework.core.codec.Encoder;
import org.springframework.core.codec.StringDecoder;
import org.springframework.http.codec.json.Jackson2JsonDecoder;
import org.springframework.http.codec.multipart.MultipartHttpMessageWriter;
/**
@ -45,14 +44,13 @@ class DefaultClientCodecConfigurer extends AbstractCodecConfigurer implements Cl
}
/**
* Default implementation of {@link ClientDefaultCodecs}.
*/
private static class ClientDefaultCodecsImpl extends AbstractDefaultCodecs
implements ClientDefaultCodecs {
private DefaultMultipartCodecs multipartCodecs;
private Decoder<?> sseDecoder;
@Override
public MultipartCodecs multipartCodecs() {
@ -64,47 +62,47 @@ class DefaultClientCodecConfigurer extends AbstractCodecConfigurer implements Cl
@Override
public void serverSentEventDecoder(Decoder<?> decoder) {
HttpMessageReader<?> reader = new ServerSentEventHttpMessageReader(decoder);
getReaders().put(ServerSentEventHttpMessageReader.class, reader);
this.sseDecoder = decoder;
}
@Override
protected boolean splitTextOnNewLine() {
return false;
}
@Override
protected void addTypedWritersTo(List<HttpMessageWriter<?>> result) {
super.addTypedWritersTo(result);
addWriterTo(result, FormHttpMessageWriter::new);
addWriterTo(result, () -> findWriter(MultipartHttpMessageWriter.class,
() -> this.multipartCodecs != null ?
new MultipartHttpMessageWriter(this.multipartCodecs.getWriters()) :
new MultipartHttpMessageWriter()));
public List<HttpMessageReader<?>> getObjectReaders() {
if (!shouldRegisterDefaults()) {
return Collections.emptyList();
}
List<HttpMessageReader<?>> result = super.getObjectReaders();
result.add(new ServerSentEventHttpMessageReader(getSseDecoder()));
return result;
}
private Decoder<?> getSseDecoder() {
if (this.sseDecoder != null) {
return this.sseDecoder;
}
return jackson2Present ? jackson2Decoder() : null;
}
@Override
protected void addObjectReadersTo(List<HttpMessageReader<?>> result) {
super.addObjectReadersTo(result);
addServerSentEventReaderTo(result);
public List<HttpMessageWriter<?>> getTypedWriters() {
if (!this.shouldRegisterDefaults()) {
return Collections.emptyList();
}
List<HttpMessageWriter<?>> result = super.getTypedWriters();
result.add(new FormHttpMessageWriter());
result.add(getMultipartHttpMessageWriter());
return result;
}
private void addServerSentEventReaderTo(List<HttpMessageReader<?>> result) {
addReaderTo(result, () -> findReader(ServerSentEventHttpMessageReader.class, () -> {
Decoder<?> decoder = null;
if (jackson2Present) {
decoder = findDecoderReader(
Jackson2JsonDecoder.class, Jackson2JsonDecoder::new).getDecoder();
}
return new ServerSentEventHttpMessageReader(decoder);
}));
}
@Override
protected void addStringReaderTextOnlyTo(List<HttpMessageReader<?>> result) {
addReaderTo(result,
() -> new DecoderHttpMessageReader<>(StringDecoder.textPlainOnly(false)));
}
@Override
protected void addStringReaderTo(List<HttpMessageReader<?>> result) {
addReaderTo(result,
() -> new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(false)));
private MultipartHttpMessageWriter getMultipartHttpMessageWriter() {
return this.multipartCodecs != null ?
new MultipartHttpMessageWriter(this.multipartCodecs.getWriters()) :
new MultipartHttpMessageWriter();
}
}

View File

@ -16,11 +16,10 @@
package org.springframework.http.codec;
import java.util.Collections;
import java.util.List;
import org.springframework.core.codec.Encoder;
import org.springframework.core.codec.StringDecoder;
import org.springframework.http.codec.json.Jackson2JsonEncoder;
import org.springframework.http.codec.multipart.MultipartHttpMessageReader;
import org.springframework.http.codec.multipart.SynchronossPartHttpMessageReader;
import org.springframework.util.ClassUtils;
@ -55,53 +54,51 @@ class DefaultServerCodecConfigurer extends AbstractCodecConfigurer implements Se
private static class ServerDefaultCodecsImpl extends AbstractDefaultCodecs
implements ServerDefaultCodecs {
private Encoder<?> sseEncoder;
@Override
public void serverSentEventEncoder(Encoder<?> encoder) {
HttpMessageWriter<?> writer = new ServerSentEventHttpMessageWriter(encoder);
getWriters().put(ServerSentEventHttpMessageWriter.class, writer);
this.sseEncoder = encoder;
}
@Override
protected boolean splitTextOnNewLine() {
return true;
}
@Override
public void addTypedReadersTo(List<HttpMessageReader<?>> result) {
super.addTypedReadersTo(result);
addReaderTo(result, FormHttpMessageReader::new);
public List<HttpMessageReader<?>> getTypedReaders() {
if (!shouldRegisterDefaults()) {
return Collections.emptyList();
}
List<HttpMessageReader<?>> result = super.getTypedReaders();
result.add(new FormHttpMessageReader());
if (synchronossMultipartPresent) {
SynchronossPartHttpMessageReader partReader = new SynchronossPartHttpMessageReader();
addReaderTo(result, () -> partReader);
addReaderTo(result, () -> new MultipartHttpMessageReader(partReader));
result.add(partReader);
result.add(new MultipartHttpMessageReader(partReader));
}
return result;
}
@Override
protected void addObjectWritersTo(List<HttpMessageWriter<?>> result) {
super.addObjectWritersTo(result);
addServerSentEventWriterTo(result);
public List<HttpMessageWriter<?>> getObjectWriters() {
if (!shouldRegisterDefaults()) {
return Collections.emptyList();
}
List<HttpMessageWriter<?>> result = super.getObjectWriters();
result.add(new ServerSentEventHttpMessageWriter(getSseEncoder()));
return result;
}
private void addServerSentEventWriterTo(List<HttpMessageWriter<?>> result) {
addWriterTo(result, () -> findWriter(ServerSentEventHttpMessageWriter.class, () -> {
Encoder<?> encoder = null;
if (jackson2Present) {
encoder = findEncoderWriter(
Jackson2JsonEncoder.class, Jackson2JsonEncoder::new).getEncoder();
}
return new ServerSentEventHttpMessageWriter(encoder);
}));
private Encoder<?> getSseEncoder() {
if (this.sseEncoder != null) {
return this.sseEncoder;
}
return jackson2Present ? jackson2Encoder() : null;
}
@Override
protected void addStringReaderTextOnlyTo(List<HttpMessageReader<?>> result) {
addReaderTo(result,
() -> new DecoderHttpMessageReader<>(StringDecoder.textPlainOnly(true)));
}
@Override
protected void addStringReaderTo(List<HttpMessageReader<?>> result) {
addReaderTo(result,
() -> new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true)));
}
}
}

View File

@ -17,6 +17,7 @@
package org.springframework.http.codec;
import org.springframework.core.codec.Encoder;
import org.springframework.http.codec.json.Jackson2JsonEncoder;
/**
* Helps to configure a list of server-side HTTP message readers and writers
@ -34,10 +35,7 @@ import org.springframework.core.codec.Encoder;
*/
public interface ServerCodecConfigurer extends CodecConfigurer {
/**
* {@inheritDoc}
* <p>Overriden to return {@link ServerDefaultCodecs}.
*/
@Override
ServerDefaultCodecs defaultCodecs();
@ -52,17 +50,17 @@ public interface ServerCodecConfigurer extends CodecConfigurer {
/**
* Extension of {@link AbstractCodecConfigurer} with extra server options.
* Extension of {@link DefaultCodecs} with extra server options.
*/
interface ServerDefaultCodecs extends DefaultCodecs {
/**
* Configure the {@code Encoder} to use for Server-Sent Events.
* <p>By default the {@link #jackson2Encoder} override is used for SSE.
* @param encoder the encoder to use
* <p>By default if this is not set, and Jackson is available, the
* {@link #jackson2Encoder} override is used instead. Use this property
* if you want to further customize the SSE encoder.
*/
void serverSentEventEncoder(Encoder<?> encoder);
}
}

View File

@ -289,13 +289,8 @@ public class CodecConfigurerTests {
private static class TestDefaultCodecs extends AbstractDefaultCodecs {
@Override
protected void addStringReaderTextOnlyTo(List<HttpMessageReader<?>> result) {
addReaderTo(result, () -> new DecoderHttpMessageReader<>(StringDecoder.textPlainOnly(true)));
}
@Override
protected void addStringReaderTo(List<HttpMessageReader<?>> result) {
addReaderTo(result, () -> new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true)));
protected boolean splitTextOnNewLine() {
return true;
}
}
}