diff --git a/spring-web/src/main/java/org/springframework/http/codec/ClientCodecConfigurer.java b/spring-web/src/main/java/org/springframework/http/codec/ClientCodecConfigurer.java index 07c53af689..2ff85f15a5 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/ClientCodecConfigurer.java +++ b/spring-web/src/main/java/org/springframework/http/codec/ClientCodecConfigurer.java @@ -13,13 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.http.codec; -import java.util.List; - import org.springframework.core.codec.Decoder; -import org.springframework.core.codec.StringDecoder; -import org.springframework.http.codec.json.Jackson2JsonDecoder; /** * Helps to configure a list of client-side HTTP message readers and writers @@ -35,71 +32,36 @@ import org.springframework.http.codec.json.Jackson2JsonDecoder; * @author Rossen Stoyanchev * @since 5.0 */ -public class ClientCodecConfigurer extends AbstractCodecConfigurer { - - - public ClientCodecConfigurer() { - super(new ClientDefaultCodecConfigurer()); - } - +public interface ClientCodecConfigurer extends CodecConfigurer { + /** + * {@inheritDoc} + *

Overriden to return {@link ClientDefaultCodecsConfigurer}. + */ @Override - public ClientDefaultCodecConfigurer defaultCodecs() { - return (ClientDefaultCodecConfigurer) super.defaultCodecs(); - } - - - @Override - protected void addDefaultTypedWriter(List> result) { - super.addDefaultTypedWriter(result); - defaultCodecs().addWriterTo(result, FormHttpMessageWriter::new); - } - - @Override - protected void addDefaultObjectReaders(List> result) { - super.addDefaultObjectReaders(result); - defaultCodecs().addServerSentEventReaderTo(result); - } + ClientDefaultCodecsConfigurer defaultCodecs(); /** - * Extension of {@code DefaultCodecConfigurer} with extra client options. + * Creates a new instance of the {@code ClientCodecConfigurer}. + * @return the created instance */ - public static class ClientDefaultCodecConfigurer extends DefaultCodecConfigurer { + static ClientCodecConfigurer create() { + return new DefaultClientCodecConfigurer(); + } + + /** + * Extension of {@link DefaultCodecConfigurer} with extra client options. + */ + interface ClientDefaultCodecsConfigurer extends DefaultCodecsConfigurer { /** * Configure the {@code Decoder} to use for Server-Sent Events. *

By default the {@link #jackson2Decoder} override is used for SSE. * @param decoder the decoder to use */ - public void serverSentEventDecoder(Decoder decoder) { - HttpMessageReader reader = new ServerSentEventHttpMessageReader(decoder); - getReaders().put(ServerSentEventHttpMessageReader.class, reader); - } - - - // Internal methods for building a list of default readers or writers... - - @Override - protected void addStringReaderTextOnlyTo(List> result) { - addReaderTo(result, () -> new DecoderHttpMessageReader<>(StringDecoder.textPlainOnly(false))); - } - - @Override - protected void addStringReaderTo(List> result) { - addReaderTo(result, () -> new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(false))); - } - - private void addServerSentEventReaderTo(List> result) { - addReaderTo(result, () -> findReader(ServerSentEventHttpMessageReader.class, () -> { - Decoder decoder = null; - if (jackson2Present) { - decoder = findDecoderReader( - Jackson2JsonDecoder.class, Jackson2JsonDecoder::new).getDecoder(); - } - return new ServerSentEventHttpMessageReader(decoder); - })); - } + void serverSentEventDecoder(Decoder decoder); } + } diff --git a/spring-web/src/main/java/org/springframework/http/codec/CodecConfigurer.java b/spring-web/src/main/java/org/springframework/http/codec/CodecConfigurer.java new file mode 100644 index 0000000000..daf5d9be50 --- /dev/null +++ b/spring-web/src/main/java/org/springframework/http/codec/CodecConfigurer.java @@ -0,0 +1,119 @@ +/* + * Copyright 2002-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.http.codec; + +import java.util.List; + +import org.springframework.core.codec.Decoder; +import org.springframework.core.codec.Encoder; +import org.springframework.http.codec.json.Jackson2JsonDecoder; +import org.springframework.http.codec.json.Jackson2JsonEncoder; + +/** + * Defines the interface for client or server HTTP message reader and writer configurers. + * + * @author Rossen Stoyanchev + * @since 5.0 + */ +public interface CodecConfigurer { + + /** + * Provide overrides for built-in HTTP message readers or writers. + */ + DefaultCodecsConfigurer defaultCodecs(); + + /** + * Whether to make default HTTP message reader and writer registrations. + *

By default this is set to {@code "true"}. + */ + void registerDefaults(boolean registerDefaults); + + /** + * Register a custom encoder or decoder. + */ + CustomCodecsConfigurer customCodecs(); + + /** + * Prepare a list of HTTP message readers. + */ + List> getReaders(); + + /** + * Prepare a list of HTTP message writers. + */ + List> getWriters(); + + + /** + * Registry and container for built-in HTTP message readers and writers. + * @see ClientCodecConfigurer.ClientDefaultCodecsConfigurer + * @see ServerCodecConfigurer.ServerDefaultCodecsConfigurer + */ + interface DefaultCodecsConfigurer { + + /** + * Override the default Jackson {@code Decoder}. + * @param decoder the decoder to use + */ + void jackson2Decoder(Jackson2JsonDecoder decoder); + + /** + * Override the default Jackson {@code Encoder} for JSON. + * @param encoder the encoder to use + */ + void jackson2Encoder(Jackson2JsonEncoder encoder); + + } + + + /** + * Registry and container for custom HTTP message readers and writers. + */ + interface CustomCodecsConfigurer { + + /** + * Add a custom {@code Decoder} internally wrapped with + * {@link DecoderHttpMessageReader}). + * @param decoder the decoder to add + */ + void decoder(Decoder decoder); + + /** + * Add a custom {@code Encoder}, internally wrapped with + * {@link EncoderHttpMessageWriter}. + * @param encoder the encoder to add + */ + void encoder(Encoder encoder); + + /** + * Add a custom {@link HttpMessageReader}. For readers of type + * {@link DecoderHttpMessageReader} consider using the shortcut + * {@link #decoder(Decoder)} instead. + * @param reader the reader to add + */ + void reader(HttpMessageReader reader); + + /** + * Add a custom {@link HttpMessageWriter}. For readers of type + * {@link EncoderHttpMessageWriter} consider using the shortcut + * {@link #encoder(Encoder)} instead. + * @param writer the writer to add + */ + void writer(HttpMessageWriter writer); + + } +} diff --git a/spring-web/src/main/java/org/springframework/http/codec/DefaultClientCodecConfigurer.java b/spring-web/src/main/java/org/springframework/http/codec/DefaultClientCodecConfigurer.java new file mode 100644 index 0000000000..a97c8fa3eb --- /dev/null +++ b/spring-web/src/main/java/org/springframework/http/codec/DefaultClientCodecConfigurer.java @@ -0,0 +1,93 @@ +/* + * Copyright 2002-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.http.codec; + +import java.util.List; + +import org.springframework.core.codec.Decoder; +import org.springframework.core.codec.StringDecoder; +import org.springframework.http.codec.json.Jackson2JsonDecoder; + +/** + * Default implementation of {@link ClientCodecConfigurer}. + * + * @author Rossen Stoyanchev + * @since 5.0 + */ +class DefaultClientCodecConfigurer extends DefaultCodecConfigurer implements ClientCodecConfigurer { + + public DefaultClientCodecConfigurer() { + super(new DefaultClientDefaultCodecsConfigurer()); + } + + @Override + public ClientDefaultCodecsConfigurer defaultCodecs() { + return (ClientDefaultCodecsConfigurer) super.defaultCodecs(); + } + + + /** + * Default implementation of {@link ClientCodecConfigurer.ClientDefaultCodecsConfigurer}. + */ + private static class DefaultClientDefaultCodecsConfigurer + extends AbstractDefaultCodecsConfigurer + implements ClientCodecConfigurer.ClientDefaultCodecsConfigurer { + + @Override + public void serverSentEventDecoder(Decoder decoder) { + HttpMessageReader reader = new ServerSentEventHttpMessageReader(decoder); + getReaders().put(ServerSentEventHttpMessageReader.class, reader); + } + + @Override + protected void addTypedWritersTo(List> result) { + super.addTypedWritersTo(result); + addWriterTo(result, FormHttpMessageWriter::new); + } + + @Override + protected void addObjectReadersTo(List> result) { + super.addObjectReadersTo(result); + addServerSentEventReaderTo(result); + } + + private void addServerSentEventReaderTo(List> 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> result) { + addReaderTo(result, + () -> new DecoderHttpMessageReader<>(StringDecoder.textPlainOnly(false))); + } + + @Override + protected void addStringReaderTo(List> result) { + addReaderTo(result, + () -> new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(false))); + } + + } + +} diff --git a/spring-web/src/main/java/org/springframework/http/codec/AbstractCodecConfigurer.java b/spring-web/src/main/java/org/springframework/http/codec/DefaultCodecConfigurer.java similarity index 63% rename from spring-web/src/main/java/org/springframework/http/codec/AbstractCodecConfigurer.java rename to spring-web/src/main/java/org/springframework/http/codec/DefaultCodecConfigurer.java index c346d08b32..610df2b118 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/AbstractCodecConfigurer.java +++ b/spring-web/src/main/java/org/springframework/http/codec/DefaultCodecConfigurer.java @@ -40,24 +40,26 @@ import org.springframework.util.Assert; import org.springframework.util.ClassUtils; /** - * Base class for client or server HTTP message reader and writer configurers. + * Default implementation of {@link CodecConfigurer}. * * @author Rossen Stoyanchev * @since 5.0 */ -public abstract class AbstractCodecConfigurer { +class DefaultCodecConfigurer implements CodecConfigurer { - public static final boolean jackson2Present = + static final boolean jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", - AbstractCodecConfigurer.class.getClassLoader()) && + org.springframework.http.codec.DefaultCodecConfigurer.class.getClassLoader()) && ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", - AbstractCodecConfigurer.class.getClassLoader()); + org.springframework.http.codec.DefaultCodecConfigurer.class + .getClassLoader()); - public static final boolean jaxb2Present = - ClassUtils.isPresent("javax.xml.bind.Binder", AbstractCodecConfigurer.class.getClassLoader()); + static final boolean jaxb2Present = + ClassUtils.isPresent("javax.xml.bind.Binder", + org.springframework.http.codec.DefaultCodecConfigurer.class.getClassLoader()); - private final DefaultCodecConfigurer defaultCodecs; + private final AbstractDefaultCodecsConfigurer defaultCodecs; private final CustomCodecConfigurer customCodecs = new CustomCodecConfigurer(); @@ -65,122 +67,68 @@ public abstract class AbstractCodecConfigurer { /** * Protected constructor with the configurer for default readers and writers. */ - protected AbstractCodecConfigurer(DefaultCodecConfigurer defaultCodecConfigurer) { + DefaultCodecConfigurer(AbstractDefaultCodecsConfigurer defaultCodecConfigurer) { Assert.notNull(defaultCodecConfigurer, "DefaultCodecConfigurer is required."); this.defaultCodecs = defaultCodecConfigurer; } - /** - * Provide overrides for built-in HTTP message readers or writers. - */ - public DefaultCodecConfigurer defaultCodecs() { + @Override + public DefaultCodecsConfigurer defaultCodecs() { return this.defaultCodecs; } - /** - * Whether to make default HTTP message reader and writer registrations. - *

By default this is set to {@code "true"}. - */ + @Override public void registerDefaults(boolean registerDefaults) { - this.defaultCodecs().setSuppressed(!registerDefaults); + this.defaultCodecs.setSuppressed(!registerDefaults); } - /** - * Register a custom encoder or decoder. - */ - public CustomCodecConfigurer customCodecs() { + @Override + public CustomCodecsConfigurer customCodecs() { return this.customCodecs; } - /** - * Prepare a list of HTTP message readers. - */ + @Override public List> getReaders() { - List> result = new ArrayList<>(); - addDefaultTypedReaders(result); - customCodecs().addTypedReadersTo(result); + this.defaultCodecs.addTypedReadersTo(result); + this.customCodecs.addTypedReadersTo(result); - addDefaultObjectReaders(result); - customCodecs().addObjectReadersTo(result); + this.defaultCodecs.addObjectReadersTo(result); + this.customCodecs.addObjectReadersTo(result); // String + "*/*" - defaultCodecs().addStringReaderTo(result); + this.defaultCodecs.addStringReaderTo(result); return result; } - /** - * Add built-in, concrete, Java type readers. - */ - protected void addDefaultTypedReaders(List> result) { - defaultCodecs().addReaderTo(result, ByteArrayDecoder.class, ByteArrayDecoder::new); - defaultCodecs().addReaderTo(result, ByteBufferDecoder.class, ByteBufferDecoder::new); - defaultCodecs().addReaderTo(result, DataBufferDecoder.class, DataBufferDecoder::new); - defaultCodecs().addReaderTo(result, ResourceDecoder.class, ResourceDecoder::new); - defaultCodecs().addStringReaderTextOnlyTo(result); - } - - /** - * Add built-in, Object-based readers. - */ - protected void addDefaultObjectReaders(List> result) { - if (jaxb2Present) { - defaultCodecs().addReaderTo(result, Jaxb2XmlDecoder.class, Jaxb2XmlDecoder::new); - } - if (jackson2Present) { - defaultCodecs().addReaderTo(result, Jackson2JsonDecoder.class, Jackson2JsonDecoder::new); - } - } - /** * Prepare a list of HTTP message writers. */ + @Override public List> getWriters() { List> result = new ArrayList<>(); - addDefaultTypedWriter(result); - customCodecs().addTypedWritersTo(result); + this.defaultCodecs.addTypedWritersTo(result); + this.customCodecs.addTypedWritersTo(result); - addDefaultObjectWriters(result); - customCodecs().addObjectWritersTo(result); + this.defaultCodecs.addObjectWritersTo(result); + this.customCodecs.addObjectWritersTo(result); // String + "*/*" - defaultCodecs().addStringWriterTo(result); + this.defaultCodecs.addStringWriterTo(result); return result; } - /** - * Add built-in, concrete, Java type readers. - */ - protected void addDefaultTypedWriter(List> result) { - defaultCodecs().addWriterTo(result, ByteArrayEncoder.class, ByteArrayEncoder::new); - defaultCodecs().addWriterTo(result, ByteBufferEncoder.class, ByteBufferEncoder::new); - defaultCodecs().addWriterTo(result, DataBufferEncoder.class, DataBufferEncoder::new); - defaultCodecs().addWriterTo(result, ResourceHttpMessageWriter::new); - defaultCodecs().addStringWriterTextPlainOnlyTo(result); - } /** - * Add built-in, Object-based readers. + * Default implementation for {@link CodecConfigurer.DefaultCodecsConfigurer}. */ - protected void addDefaultObjectWriters(List> result) { - if (jaxb2Present) { - defaultCodecs().addWriterTo(result, Jaxb2XmlEncoder.class, Jaxb2XmlEncoder::new); - } - if (jackson2Present) { - defaultCodecs().addWriterTo(result, Jackson2JsonEncoder.class, Jackson2JsonEncoder::new); - } - } - - - /** - * A registry and a factory for built-in HTTP message readers and writers. - */ - public abstract static class DefaultCodecConfigurer { + abstract static class AbstractDefaultCodecsConfigurer + implements CodecConfigurer.DefaultCodecsConfigurer { private boolean suppressed = false; @@ -188,23 +136,51 @@ public abstract class AbstractCodecConfigurer { private final Map, HttpMessageWriter> writers = new HashMap<>(); - - /** - * Override the default Jackson {@code Decoder}. - * @param decoder the decoder to use - */ + @Override public void jackson2Decoder(Jackson2JsonDecoder decoder) { this.readers.put(Jackson2JsonDecoder.class, new DecoderHttpMessageReader<>(decoder)); } - /** - * Override the default Jackson {@code Encoder} for JSON. - * @param encoder the encoder to use - */ + @Override public void jackson2Encoder(Jackson2JsonEncoder encoder) { this.writers.put(Jackson2JsonEncoder.class, new EncoderHttpMessageWriter<>(encoder)); } + public void addTypedReadersTo(List> 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 void addTypedWritersTo(List> 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); + } + + + protected void addObjectReadersTo(List> result) { + if (jaxb2Present) { + addReaderTo(result, Jaxb2XmlDecoder.class, Jaxb2XmlDecoder::new); + } + if (jackson2Present) { + addReaderTo(result, Jackson2JsonDecoder.class, Jackson2JsonDecoder::new); + } + } + + protected void addObjectWritersTo(List> result) { + if (jaxb2Present) { + addWriterTo(result, Jaxb2XmlEncoder.class, Jaxb2XmlEncoder::new); + } + if (jackson2Present) { + addWriterTo(result, Jackson2JsonEncoder.class, Jackson2JsonEncoder::new); + } + } + // Accessors for internal use... @@ -292,10 +268,11 @@ public abstract class AbstractCodecConfigurer { } } + /** - * Registry and container for custom HTTP message readers and writers. + * Default implementation of CustomCodecsConfigurer. */ - public static class CustomCodecConfigurer { + private static class CustomCodecConfigurer implements CodecConfigurer.CustomCodecsConfigurer { private final List> typedReaders = new ArrayList<>(); @@ -306,47 +283,28 @@ public abstract class AbstractCodecConfigurer { private final List> objectWriters = new ArrayList<>(); - /** - * Add a custom {@code Decoder} internally wrapped with - * {@link DecoderHttpMessageReader}). - * @param decoder the decoder to add - */ + @Override public void decoder(Decoder decoder) { reader(new DecoderHttpMessageReader<>(decoder)); } - /** - * Add a custom {@code Encoder}, internally wrapped with - * {@link EncoderHttpMessageWriter}. - * @param encoder the encoder to add - */ + @Override public void encoder(Encoder encoder) { writer(new EncoderHttpMessageWriter<>(encoder)); } - /** - * Add a custom {@link HttpMessageReader}. For readers of type - * {@link DecoderHttpMessageReader} consider using the shortcut - * {@link #decoder(Decoder)} instead. - * @param reader the reader to add - */ + @Override public void reader(HttpMessageReader reader) { boolean canReadToObject = reader.canRead(ResolvableType.forClass(Object.class), null); (canReadToObject ? this.objectReaders : this.typedReaders).add(reader); } - /** - * Add a custom {@link HttpMessageWriter}. For readers of type - * {@link EncoderHttpMessageWriter} consider using the shortcut - * {@link #encoder(Encoder)} instead. - * @param writer the writer to add - */ + @Override public void writer(HttpMessageWriter writer) { boolean canWriteObject = writer.canWrite(ResolvableType.forClass(Object.class), null); (canWriteObject ? this.objectWriters : this.typedWriters).add(writer); } - // Internal methods for building a list of custom readers or writers... protected void addTypedReadersTo(List> result) { diff --git a/spring-web/src/main/java/org/springframework/http/codec/DefaultServerCodecConfigurer.java b/spring-web/src/main/java/org/springframework/http/codec/DefaultServerCodecConfigurer.java new file mode 100644 index 0000000000..6568333da2 --- /dev/null +++ b/spring-web/src/main/java/org/springframework/http/codec/DefaultServerCodecConfigurer.java @@ -0,0 +1,94 @@ +/* + * Copyright 2002-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.http.codec; + +import java.util.List; + +import org.springframework.core.codec.Encoder; +import org.springframework.core.codec.StringDecoder; +import org.springframework.http.codec.json.Jackson2JsonEncoder; + +/** + * Default implementation of {@link ServerCodecConfigurer}. + * + * @author Rossen Stoyanchev + * @since 5.0 + */ +class DefaultServerCodecConfigurer extends DefaultCodecConfigurer implements ServerCodecConfigurer { + + public DefaultServerCodecConfigurer() { + super(new DefaultServerDefaultCodecsConfigurer()); + } + + @Override + public ServerDefaultCodecsConfigurer defaultCodecs() { + return (ServerDefaultCodecsConfigurer) super.defaultCodecs(); + } + + + /** + * Default implementation of {@link ServerCodecConfigurer.ServerDefaultCodecsConfigurer}. + */ + private static class DefaultServerDefaultCodecsConfigurer + extends AbstractDefaultCodecsConfigurer + implements ServerCodecConfigurer.ServerDefaultCodecsConfigurer { + + @Override + public void serverSentEventEncoder(Encoder encoder) { + HttpMessageWriter writer = new ServerSentEventHttpMessageWriter(encoder); + getWriters().put(ServerSentEventHttpMessageWriter.class, writer); + } + + @Override + public void addTypedReadersTo(List> result) { + super.addTypedReadersTo(result); + addReaderTo(result, FormHttpMessageReader::new); + } + + @Override + protected void addObjectWritersTo(List> result) { + super.addObjectWritersTo(result); + addServerSentEventWriterTo(result); + } + + + private void addServerSentEventWriterTo(List> result) { + addWriterTo(result, () -> findWriter(ServerSentEventHttpMessageWriter.class, () -> { + Encoder encoder = null; + if (jackson2Present) { + encoder = findEncoderWriter( + Jackson2JsonEncoder.class, Jackson2JsonEncoder::new).getEncoder(); + } + return new ServerSentEventHttpMessageWriter(encoder); + })); + } + + @Override + protected void addStringReaderTextOnlyTo(List> result) { + addReaderTo(result, + () -> new DecoderHttpMessageReader<>(StringDecoder.textPlainOnly(true))); + } + + @Override + protected void addStringReaderTo(List> result) { + addReaderTo(result, + () -> new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true))); + } + + } + +} diff --git a/spring-web/src/main/java/org/springframework/http/codec/ServerCodecConfigurer.java b/spring-web/src/main/java/org/springframework/http/codec/ServerCodecConfigurer.java index bdc6a86248..18d666f42d 100644 --- a/spring-web/src/main/java/org/springframework/http/codec/ServerCodecConfigurer.java +++ b/spring-web/src/main/java/org/springframework/http/codec/ServerCodecConfigurer.java @@ -13,13 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.http.codec; -import java.util.List; - import org.springframework.core.codec.Encoder; -import org.springframework.core.codec.StringDecoder; -import org.springframework.http.codec.json.Jackson2JsonEncoder; /** * Helps to configure a list of server-side HTTP message readers and writers @@ -35,72 +32,37 @@ import org.springframework.http.codec.json.Jackson2JsonEncoder; * @author Rossen Stoyanchev * @since 5.0 */ -public class ServerCodecConfigurer extends AbstractCodecConfigurer { - - - public ServerCodecConfigurer() { - super(new ServerDefaultCodecConfigurer()); - } - +public interface ServerCodecConfigurer extends CodecConfigurer { + /** + * {@inheritDoc} + *

Overriden to return {@link ServerDefaultCodecsConfigurer}. + */ @Override - public ServerDefaultCodecConfigurer defaultCodecs() { - return (ServerDefaultCodecConfigurer) super.defaultCodecs(); - } + ServerDefaultCodecsConfigurer defaultCodecs(); - @Override - protected void addDefaultTypedReaders(List> result) { - super.addDefaultTypedReaders(result); - defaultCodecs().addReaderTo(result, FormHttpMessageReader::new); - } - - - @Override - protected void addDefaultObjectWriters(List> result) { - super.addDefaultObjectWriters(result); - defaultCodecs().addServerSentEventWriterTo(result); + /** + * Creates a new instance of the {@code ServerCodecConfigurer}. + * @return the created instance + */ + static ServerCodecConfigurer create() { + return new DefaultServerCodecConfigurer(); } /** - * Extension of {@code DefaultCodecConfigurer} with extra server options. + * Extension of {@link DefaultCodecConfigurer} with extra server options. */ - public static class ServerDefaultCodecConfigurer extends DefaultCodecConfigurer { + interface ServerDefaultCodecsConfigurer extends DefaultCodecsConfigurer { /** * Configure the {@code Encoder} to use for Server-Sent Events. *

By default the {@link #jackson2Encoder} override is used for SSE. * @param encoder the encoder to use */ - public void serverSentEventEncoder(Encoder encoder) { - HttpMessageWriter writer = new ServerSentEventHttpMessageWriter(encoder); - getWriters().put(ServerSentEventHttpMessageWriter.class, writer); - } + void serverSentEventEncoder(Encoder encoder); - - // Internal methods for building a list of default readers or writers... - - @Override - protected void addStringReaderTextOnlyTo(List> result) { - addReaderTo(result, () -> new DecoderHttpMessageReader<>(StringDecoder.textPlainOnly(true))); - } - - @Override - protected void addStringReaderTo(List> result) { - addReaderTo(result, () -> new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true))); - } - - private void addServerSentEventWriterTo(List> result) { - addWriterTo(result, () -> findWriter(ServerSentEventHttpMessageWriter.class, () -> { - Encoder encoder = null; - if (jackson2Present) { - encoder = findEncoderWriter( - Jackson2JsonEncoder.class, Jackson2JsonEncoder::new).getEncoder(); - } - return new ServerSentEventHttpMessageWriter(encoder); - })); - } } } diff --git a/spring-web/src/test/java/org/springframework/http/codec/ClientCodecConfigurerTests.java b/spring-web/src/test/java/org/springframework/http/codec/ClientCodecConfigurerTests.java index 16545e76c8..dae0beb971 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/ClientCodecConfigurerTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/ClientCodecConfigurerTests.java @@ -53,7 +53,7 @@ import static org.springframework.core.ResolvableType.forClass; */ public class ClientCodecConfigurerTests { - private final ClientCodecConfigurer configurer = new ClientCodecConfigurer(); + private final ClientCodecConfigurer configurer = new DefaultClientCodecConfigurer(); private final AtomicInteger index = new AtomicInteger(0); diff --git a/spring-web/src/test/java/org/springframework/http/codec/CodecConfigurerTests.java b/spring-web/src/test/java/org/springframework/http/codec/CodecConfigurerTests.java index 5cbaf9d5cd..c7b0b47f14 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/CodecConfigurerTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/CodecConfigurerTests.java @@ -44,12 +44,12 @@ import static org.mockito.Mockito.*; import static org.springframework.core.ResolvableType.forClass; /** - * Unit tests for {@link ServerCodecConfigurer}. + * Unit tests for {@link org.springframework.http.codec.DefaultCodecConfigurer.AbstractDefaultCodecsConfigurer}. * @author Rossen Stoyanchev */ public class CodecConfigurerTests { - private final TestCodecConfigurer configurer = new TestCodecConfigurer(); + private final CodecConfigurer configurer = new DefaultCodecConfigurer(new TestDefaultCodecConfigurer()); private final AtomicInteger index = new AtomicInteger(0); @@ -276,14 +276,9 @@ public class CodecConfigurerTests { } - private static class TestCodecConfigurer extends AbstractCodecConfigurer { - - private TestCodecConfigurer() { - super(new TestDefaultCodecConfigurer()); - } - private static class TestDefaultCodecConfigurer extends DefaultCodecConfigurer { + private static class TestDefaultCodecConfigurer extends DefaultCodecConfigurer.AbstractDefaultCodecsConfigurer { @Override protected void addStringReaderTextOnlyTo(List> result) { @@ -295,6 +290,5 @@ public class CodecConfigurerTests { addReaderTo(result, () -> new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes(true))); } } - } } diff --git a/spring-web/src/test/java/org/springframework/http/codec/ServerCodecConfigurerTests.java b/spring-web/src/test/java/org/springframework/http/codec/ServerCodecConfigurerTests.java index 14d9d6f459..b7ff23807c 100644 --- a/spring-web/src/test/java/org/springframework/http/codec/ServerCodecConfigurerTests.java +++ b/spring-web/src/test/java/org/springframework/http/codec/ServerCodecConfigurerTests.java @@ -54,7 +54,7 @@ import static org.springframework.core.ResolvableType.forClass; */ public class ServerCodecConfigurerTests { - private final ServerCodecConfigurer configurer = new ServerCodecConfigurer(); + private final ServerCodecConfigurer configurer = new DefaultServerCodecConfigurer(); private final AtomicInteger index = new AtomicInteger(0);