Allow ExchangeStrategies customizations in WebClient
Backport ofd4209392andacfeb77dCloses gh-23961
This commit is contained in:
committed by
Rossen Stoyanchev
parent
59165dd526
commit
83683a13bb
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
* Copyright 2002-2019 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.
|
||||
@@ -63,6 +63,12 @@ public interface ClientCodecConfigurer extends CodecConfigurer {
|
||||
@Override
|
||||
ClientDefaultCodecs defaultCodecs();
|
||||
|
||||
/**
|
||||
* {@inheritDoc}.
|
||||
*/
|
||||
@Override
|
||||
ClientCodecConfigurer clone();
|
||||
|
||||
|
||||
/**
|
||||
* Static factory method for a {@code ClientCodecConfigurer}.
|
||||
|
||||
@@ -87,6 +87,15 @@ public interface CodecConfigurer {
|
||||
*/
|
||||
List<HttpMessageWriter<?>> getWriters();
|
||||
|
||||
/**
|
||||
* Create a copy of this {@link CodecConfigurer}. The returned clone has its
|
||||
* own lists of default and custom codecs and generally can be configured
|
||||
* independently. Keep in mind however that codec instances (if any are
|
||||
* configured) are themselves not cloned.
|
||||
* @since 5.1.12
|
||||
*/
|
||||
CodecConfigurer clone();
|
||||
|
||||
|
||||
/**
|
||||
* Customize or replace the HTTP message readers and writers registered by
|
||||
|
||||
@@ -62,6 +62,12 @@ public interface ServerCodecConfigurer extends CodecConfigurer {
|
||||
@Override
|
||||
ServerDefaultCodecs defaultCodecs();
|
||||
|
||||
/**
|
||||
* {@inheritDoc}.
|
||||
*/
|
||||
@Override
|
||||
ServerCodecConfigurer clone();
|
||||
|
||||
|
||||
/**
|
||||
* Static factory method for a {@code ServerCodecConfigurer}.
|
||||
|
||||
@@ -34,13 +34,14 @@ import org.springframework.util.Assert;
|
||||
* client and server specific variants.
|
||||
*
|
||||
* @author Rossen Stoyanchev
|
||||
* @author Brian Clozel
|
||||
* @since 5.0
|
||||
*/
|
||||
class BaseCodecConfigurer implements CodecConfigurer {
|
||||
abstract class BaseCodecConfigurer implements CodecConfigurer {
|
||||
|
||||
private final BaseDefaultCodecs defaultCodecs;
|
||||
protected final BaseDefaultCodecs defaultCodecs;
|
||||
|
||||
private final DefaultCustomCodecs customCodecs = new DefaultCustomCodecs();
|
||||
protected final DefaultCustomCodecs customCodecs;
|
||||
|
||||
|
||||
/**
|
||||
@@ -50,8 +51,25 @@ class BaseCodecConfigurer implements CodecConfigurer {
|
||||
BaseCodecConfigurer(BaseDefaultCodecs defaultCodecs) {
|
||||
Assert.notNull(defaultCodecs, "'defaultCodecs' is required");
|
||||
this.defaultCodecs = defaultCodecs;
|
||||
this.customCodecs = new DefaultCustomCodecs();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a deep copy of the given {@link BaseCodecConfigurer}.
|
||||
* @since 5.1.12
|
||||
*/
|
||||
protected BaseCodecConfigurer(BaseCodecConfigurer other) {
|
||||
this.defaultCodecs = other.cloneDefaultCodecs();
|
||||
this.customCodecs = new DefaultCustomCodecs(other.customCodecs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sub-classes should override this to create deep copy of
|
||||
* {@link BaseDefaultCodecs} which can can be client or server specific.
|
||||
* @since 5.1.12
|
||||
*/
|
||||
protected abstract BaseDefaultCodecs cloneDefaultCodecs();
|
||||
|
||||
|
||||
@Override
|
||||
public DefaultCodecs defaultCodecs() {
|
||||
@@ -87,6 +105,7 @@ class BaseCodecConfigurer implements CodecConfigurer {
|
||||
return getWritersInternal(false);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Internal method that returns the configured writers.
|
||||
* @param forMultipart whether to returns writers for general use ("false"),
|
||||
@@ -106,11 +125,14 @@ class BaseCodecConfigurer implements CodecConfigurer {
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public abstract CodecConfigurer clone();
|
||||
|
||||
|
||||
/**
|
||||
* Default implementation of {@code CustomCodecs}.
|
||||
*/
|
||||
private static final class DefaultCustomCodecs implements CustomCodecs {
|
||||
protected static final class DefaultCustomCodecs implements CustomCodecs {
|
||||
|
||||
private final List<HttpMessageReader<?>> typedReaders = new ArrayList<>();
|
||||
|
||||
@@ -121,6 +143,20 @@ class BaseCodecConfigurer implements CodecConfigurer {
|
||||
private final List<HttpMessageWriter<?>> objectWriters = new ArrayList<>();
|
||||
|
||||
|
||||
DefaultCustomCodecs() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a deep copy of the given {@link DefaultCustomCodecs}.
|
||||
* @since 5.1.12
|
||||
*/
|
||||
DefaultCustomCodecs(DefaultCustomCodecs other) {
|
||||
other.typedReaders.addAll(this.typedReaders);
|
||||
other.typedWriters.addAll(this.typedWriters);
|
||||
other.objectReaders.addAll(this.objectReaders);
|
||||
other.objectWriters.addAll(this.objectWriters);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void decoder(Decoder<?> decoder) {
|
||||
reader(new DecoderHttpMessageReader<>(decoder));
|
||||
|
||||
@@ -105,6 +105,24 @@ class BaseDefaultCodecs implements CodecConfigurer.DefaultCodecs {
|
||||
private boolean registerDefaults = true;
|
||||
|
||||
|
||||
BaseDefaultCodecs() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a deep copy of the given {@link BaseDefaultCodecs}.
|
||||
*/
|
||||
protected BaseDefaultCodecs(BaseDefaultCodecs other) {
|
||||
this.jackson2JsonDecoder = other.jackson2JsonDecoder;
|
||||
this.jackson2JsonEncoder = other.jackson2JsonEncoder;
|
||||
this.protobufDecoder = other.protobufDecoder;
|
||||
this.protobufEncoder = other.protobufEncoder;
|
||||
this.jaxb2Decoder = other.jaxb2Decoder;
|
||||
this.jaxb2Encoder = other.jaxb2Encoder;
|
||||
this.maxInMemorySize = other.maxInMemorySize;
|
||||
this.enableLoggingRequestDetails = other.enableLoggingRequestDetails;
|
||||
this.registerDefaults = other.registerDefaults;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void jackson2JsonDecoder(Decoder<?> decoder) {
|
||||
this.jackson2JsonDecoder = decoder;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
* Copyright 2002-2019 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.
|
||||
@@ -49,6 +49,17 @@ class ClientDefaultCodecsImpl extends BaseDefaultCodecs implements ClientCodecCo
|
||||
private Supplier<List<HttpMessageWriter<?>>> partWritersSupplier;
|
||||
|
||||
|
||||
ClientDefaultCodecsImpl() {
|
||||
}
|
||||
|
||||
ClientDefaultCodecsImpl(ClientDefaultCodecsImpl other) {
|
||||
super(other);
|
||||
this.multipartCodecs = new DefaultMultipartCodecs(other.multipartCodecs);
|
||||
this.sseDecoder = other.sseDecoder;
|
||||
this.partWritersSupplier = other.partWritersSupplier;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set a supplier for part writers to use when
|
||||
* {@link #multipartCodecs()} are not explicitly configured.
|
||||
@@ -73,6 +84,14 @@ class ClientDefaultCodecsImpl extends BaseDefaultCodecs implements ClientCodecCo
|
||||
this.sseDecoder = decoder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientDefaultCodecsImpl clone() {
|
||||
ClientDefaultCodecsImpl codecs = new ClientDefaultCodecsImpl();
|
||||
codecs.multipartCodecs = this.multipartCodecs;
|
||||
codecs.sseDecoder = this.sseDecoder;
|
||||
codecs.partWritersSupplier = this.partWritersSupplier;
|
||||
return codecs;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void extendObjectReaders(List<HttpMessageReader<?>> objectReaders) {
|
||||
@@ -116,6 +135,17 @@ class ClientDefaultCodecsImpl extends BaseDefaultCodecs implements ClientCodecCo
|
||||
|
||||
private final List<HttpMessageWriter<?>> writers = new ArrayList<>();
|
||||
|
||||
|
||||
DefaultMultipartCodecs() {
|
||||
}
|
||||
|
||||
DefaultMultipartCodecs(@Nullable DefaultMultipartCodecs other) {
|
||||
if (other != null) {
|
||||
this.writers.addAll(other.writers);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public ClientCodecConfigurer.MultipartCodecs encoder(Encoder<?> encoder) {
|
||||
writer(new EncoderHttpMessageWriter<>(encoder));
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
* Copyright 2002-2019 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.
|
||||
@@ -26,14 +26,30 @@ import org.springframework.http.codec.ClientCodecConfigurer;
|
||||
*/
|
||||
public class DefaultClientCodecConfigurer extends BaseCodecConfigurer implements ClientCodecConfigurer {
|
||||
|
||||
|
||||
public DefaultClientCodecConfigurer() {
|
||||
super(new ClientDefaultCodecsImpl());
|
||||
((ClientDefaultCodecsImpl) defaultCodecs()).setPartWritersSupplier(() -> getWritersInternal(true));
|
||||
}
|
||||
|
||||
private DefaultClientCodecConfigurer(DefaultClientCodecConfigurer other) {
|
||||
super(other);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public ClientDefaultCodecs defaultCodecs() {
|
||||
return (ClientDefaultCodecs) super.defaultCodecs();
|
||||
}
|
||||
|
||||
@Override
|
||||
public DefaultClientCodecConfigurer clone() {
|
||||
return new DefaultClientCodecConfigurer(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BaseDefaultCodecs cloneDefaultCodecs() {
|
||||
return new ClientDefaultCodecsImpl((ClientDefaultCodecsImpl) defaultCodecs());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2018 the original author or authors.
|
||||
* Copyright 2002-2019 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.
|
||||
@@ -26,13 +26,28 @@ import org.springframework.http.codec.ServerCodecConfigurer;
|
||||
*/
|
||||
public class DefaultServerCodecConfigurer extends BaseCodecConfigurer implements ServerCodecConfigurer {
|
||||
|
||||
|
||||
public DefaultServerCodecConfigurer() {
|
||||
super(new ServerDefaultCodecsImpl());
|
||||
}
|
||||
|
||||
private DefaultServerCodecConfigurer(BaseCodecConfigurer other) {
|
||||
super(other);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public ServerDefaultCodecs defaultCodecs() {
|
||||
return (ServerDefaultCodecs) super.defaultCodecs();
|
||||
}
|
||||
|
||||
@Override
|
||||
public DefaultServerCodecConfigurer clone() {
|
||||
return new DefaultServerCodecConfigurer(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BaseDefaultCodecs cloneDefaultCodecs() {
|
||||
return new ServerDefaultCodecsImpl((ServerDefaultCodecsImpl) defaultCodecs());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,6 +46,16 @@ class ServerDefaultCodecsImpl extends BaseDefaultCodecs implements ServerCodecCo
|
||||
private Encoder<?> sseEncoder;
|
||||
|
||||
|
||||
ServerDefaultCodecsImpl() {
|
||||
}
|
||||
|
||||
ServerDefaultCodecsImpl(ServerDefaultCodecsImpl other) {
|
||||
super(other);
|
||||
this.multipartReader = other.multipartReader;
|
||||
this.sseEncoder = other.sseEncoder;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void multipartReader(HttpMessageReader<?> reader) {
|
||||
this.multipartReader = reader;
|
||||
|
||||
@@ -22,6 +22,7 @@ import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.junit.Test;
|
||||
import reactor.core.publisher.Flux;
|
||||
@@ -59,7 +60,11 @@ import org.springframework.http.codec.xml.Jaxb2XmlDecoder;
|
||||
import org.springframework.http.codec.xml.Jaxb2XmlEncoder;
|
||||
import org.springframework.util.MimeTypeUtils;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNotSame;
|
||||
import static org.junit.Assert.assertSame;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.springframework.core.ResolvableType.forClass;
|
||||
|
||||
/**
|
||||
@@ -122,6 +127,47 @@ public class ClientCodecConfigurerTests {
|
||||
.filter(e -> e == decoder).orElse(null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void cloneConfigurer() {
|
||||
ClientCodecConfigurer clone = this.configurer.clone();
|
||||
|
||||
Jackson2JsonDecoder jackson2Decoder = new Jackson2JsonDecoder();
|
||||
clone.defaultCodecs().serverSentEventDecoder(jackson2Decoder);
|
||||
clone.defaultCodecs().multipartCodecs().encoder(new Jackson2SmileEncoder());
|
||||
clone.defaultCodecs().multipartCodecs().writer(new ResourceHttpMessageWriter());
|
||||
|
||||
// Clone has the customizations
|
||||
|
||||
Decoder<?> sseDecoder = clone.getReaders().stream()
|
||||
.filter(reader -> reader instanceof ServerSentEventHttpMessageReader)
|
||||
.map(reader -> ((ServerSentEventHttpMessageReader) reader).getDecoder())
|
||||
.findFirst()
|
||||
.get();
|
||||
|
||||
List<HttpMessageWriter<?>> multipartWriters = clone.getWriters().stream()
|
||||
.filter(writer -> writer instanceof MultipartHttpMessageWriter)
|
||||
.flatMap(writer -> ((MultipartHttpMessageWriter) writer).getPartWriters().stream())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
assertSame(jackson2Decoder, sseDecoder);
|
||||
assertEquals(2, multipartWriters.size());
|
||||
|
||||
// Original does not have the customizations
|
||||
|
||||
sseDecoder = this.configurer.getReaders().stream()
|
||||
.filter(reader -> reader instanceof ServerSentEventHttpMessageReader)
|
||||
.map(reader -> ((ServerSentEventHttpMessageReader) reader).getDecoder())
|
||||
.findFirst()
|
||||
.get();
|
||||
|
||||
multipartWriters = this.configurer.getWriters().stream()
|
||||
.filter(writer -> writer instanceof MultipartHttpMessageWriter)
|
||||
.flatMap(writer -> ((MultipartHttpMessageWriter) writer).getPartWriters().stream())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
assertNotSame(jackson2Decoder, sseDecoder);
|
||||
assertEquals(10, multipartWriters.size());
|
||||
}
|
||||
|
||||
private Decoder<?> getNextDecoder(List<HttpMessageReader<?>> readers) {
|
||||
HttpMessageReader<?> reader = readers.get(this.index.getAndIncrement());
|
||||
|
||||
@@ -16,8 +16,10 @@
|
||||
|
||||
package org.springframework.http.codec.support;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.google.protobuf.ExtensionRegistry;
|
||||
import org.junit.Test;
|
||||
@@ -42,6 +44,8 @@ import org.springframework.http.codec.FormHttpMessageReader;
|
||||
import org.springframework.http.codec.HttpMessageReader;
|
||||
import org.springframework.http.codec.HttpMessageWriter;
|
||||
import org.springframework.http.codec.ResourceHttpMessageWriter;
|
||||
import org.springframework.http.codec.ServerSentEventHttpMessageReader;
|
||||
import org.springframework.http.codec.ServerSentEventHttpMessageWriter;
|
||||
import org.springframework.http.codec.json.Jackson2JsonDecoder;
|
||||
import org.springframework.http.codec.json.Jackson2JsonEncoder;
|
||||
import org.springframework.http.codec.json.Jackson2SmileDecoder;
|
||||
@@ -267,6 +271,71 @@ public class CodecConfigurerTests {
|
||||
assertEncoderInstance(jaxb2Encoder);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void cloneCustomCodecs() {
|
||||
this.configurer.registerDefaults(false);
|
||||
CodecConfigurer clone = this.configurer.clone();
|
||||
|
||||
clone.customCodecs().encoder(new Jackson2JsonEncoder());
|
||||
clone.customCodecs().decoder(new Jackson2JsonDecoder());
|
||||
clone.customCodecs().reader(new ServerSentEventHttpMessageReader());
|
||||
clone.customCodecs().writer(new ServerSentEventHttpMessageWriter());
|
||||
|
||||
assertEquals(0, this.configurer.getReaders().size());
|
||||
assertEquals(0, this.configurer.getWriters().size());
|
||||
assertEquals(2, clone.getReaders().size());
|
||||
assertEquals(2, clone.getWriters().size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void cloneDefaultCodecs() {
|
||||
CodecConfigurer clone = this.configurer.clone();
|
||||
|
||||
Jackson2JsonDecoder jacksonDecoder = new Jackson2JsonDecoder();
|
||||
Jackson2JsonEncoder jacksonEncoder = new Jackson2JsonEncoder();
|
||||
Jaxb2XmlDecoder jaxb2Decoder = new Jaxb2XmlDecoder();
|
||||
Jaxb2XmlEncoder jaxb2Encoder = new Jaxb2XmlEncoder();
|
||||
ProtobufDecoder protoDecoder = new ProtobufDecoder();
|
||||
ProtobufEncoder protoEncoder = new ProtobufEncoder();
|
||||
|
||||
clone.defaultCodecs().jackson2JsonDecoder(jacksonDecoder);
|
||||
clone.defaultCodecs().jackson2JsonEncoder(jacksonEncoder);
|
||||
clone.defaultCodecs().jaxb2Decoder(jaxb2Decoder);
|
||||
clone.defaultCodecs().jaxb2Encoder(jaxb2Encoder);
|
||||
clone.defaultCodecs().protobufDecoder(protoDecoder);
|
||||
clone.defaultCodecs().protobufEncoder(protoEncoder);
|
||||
|
||||
// Clone has the customized the customizations
|
||||
|
||||
List<Decoder<?>> decoders = clone.getReaders().stream()
|
||||
.filter(reader -> reader instanceof DecoderHttpMessageReader)
|
||||
.map(reader -> ((DecoderHttpMessageReader<?>) reader).getDecoder())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
List<Encoder<?>> encoders = clone.getWriters().stream()
|
||||
.filter(writer -> writer instanceof EncoderHttpMessageWriter)
|
||||
.map(reader -> ((EncoderHttpMessageWriter<?>) reader).getEncoder())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
assertTrue(decoders.containsAll(Arrays.asList(jacksonDecoder, jaxb2Decoder, protoDecoder)));
|
||||
assertTrue(encoders.containsAll(Arrays.asList(jacksonEncoder, jaxb2Encoder, protoEncoder)));
|
||||
|
||||
// Original does not have the customizations
|
||||
|
||||
decoders = this.configurer.getReaders().stream()
|
||||
.filter(reader -> reader instanceof DecoderHttpMessageReader)
|
||||
.map(reader -> ((DecoderHttpMessageReader<?>) reader).getDecoder())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
encoders = this.configurer.getWriters().stream()
|
||||
.filter(writer -> writer instanceof EncoderHttpMessageWriter)
|
||||
.map(reader -> ((EncoderHttpMessageWriter<?>) reader).getEncoder())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
assertFalse(decoders.containsAll(Arrays.asList(jacksonDecoder, jaxb2Decoder, protoDecoder)));
|
||||
assertFalse(encoders.containsAll(Arrays.asList(jacksonEncoder, jaxb2Encoder, protoEncoder)));
|
||||
}
|
||||
|
||||
private Decoder<?> getNextDecoder(List<HttpMessageReader<?>> readers) {
|
||||
HttpMessageReader<?> reader = readers.get(this.index.getAndIncrement());
|
||||
assertEquals(DecoderHttpMessageReader.class, reader.getClass());
|
||||
@@ -313,10 +382,21 @@ public class CodecConfigurerTests {
|
||||
private static class TestCodecConfigurer extends BaseCodecConfigurer {
|
||||
|
||||
TestCodecConfigurer() {
|
||||
super(new TestDefaultCodecs());
|
||||
super(new BaseDefaultCodecs());
|
||||
}
|
||||
|
||||
private static class TestDefaultCodecs extends BaseDefaultCodecs {
|
||||
TestCodecConfigurer(TestCodecConfigurer other) {
|
||||
super(other);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BaseDefaultCodecs cloneDefaultCodecs() {
|
||||
return new BaseDefaultCodecs((BaseDefaultCodecs) defaultCodecs());
|
||||
}
|
||||
|
||||
@Override
|
||||
public CodecConfigurer clone() {
|
||||
return new TestCodecConfigurer(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -60,7 +60,11 @@ import org.springframework.http.codec.xml.Jaxb2XmlDecoder;
|
||||
import org.springframework.http.codec.xml.Jaxb2XmlEncoder;
|
||||
import org.springframework.util.MimeTypeUtils;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNotSame;
|
||||
import static org.junit.Assert.assertSame;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.springframework.core.ResolvableType.forClass;
|
||||
|
||||
/**
|
||||
@@ -149,6 +153,50 @@ public class ServerCodecConfigurerTests {
|
||||
assertEquals(size, ((StringDecoder) getNextDecoder(readers)).getMaxInMemorySize());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void cloneConfigurer() {
|
||||
ServerCodecConfigurer clone = this.configurer.clone();
|
||||
|
||||
MultipartHttpMessageReader reader = new MultipartHttpMessageReader(new SynchronossPartHttpMessageReader());
|
||||
Jackson2JsonEncoder encoder = new Jackson2JsonEncoder();
|
||||
clone.defaultCodecs().multipartReader(reader);
|
||||
clone.defaultCodecs().serverSentEventEncoder(encoder);
|
||||
|
||||
// Clone has the customizations
|
||||
|
||||
HttpMessageReader<?> actualReader = clone.getReaders().stream()
|
||||
.filter(r -> r instanceof MultipartHttpMessageReader)
|
||||
.findFirst()
|
||||
.get();
|
||||
|
||||
Encoder<?> actualEncoder = clone.getWriters().stream()
|
||||
.filter(writer -> writer instanceof ServerSentEventHttpMessageWriter)
|
||||
.map(writer -> ((ServerSentEventHttpMessageWriter) writer).getEncoder())
|
||||
.findFirst()
|
||||
.get();
|
||||
|
||||
|
||||
assertSame(reader, actualReader);
|
||||
assertSame(encoder, actualEncoder);
|
||||
|
||||
// Original does not have the customizations
|
||||
|
||||
actualReader = this.configurer.getReaders().stream()
|
||||
.filter(r -> r instanceof MultipartHttpMessageReader)
|
||||
.findFirst()
|
||||
.get();
|
||||
|
||||
actualEncoder = this.configurer.getWriters().stream()
|
||||
.filter(writer -> writer instanceof ServerSentEventHttpMessageWriter)
|
||||
.map(writer -> ((ServerSentEventHttpMessageWriter) writer).getEncoder())
|
||||
.findFirst()
|
||||
.get();
|
||||
|
||||
|
||||
assertNotSame(reader, actualReader);
|
||||
assertNotSame(encoder, actualEncoder);
|
||||
}
|
||||
|
||||
private Decoder<?> getNextDecoder(List<HttpMessageReader<?>> readers) {
|
||||
HttpMessageReader<?> reader = nextReader(readers);
|
||||
assertEquals(DecoderHttpMessageReader.class, reader.getClass());
|
||||
|
||||
Reference in New Issue
Block a user