|
|
|
@ -18,6 +18,7 @@ package org.springframework.http.codec.support; |
|
|
|
|
|
|
|
|
|
|
|
import java.util.List; |
|
|
|
import java.util.List; |
|
|
|
import java.util.concurrent.atomic.AtomicInteger; |
|
|
|
import java.util.concurrent.atomic.AtomicInteger; |
|
|
|
|
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
|
|
|
|
import com.google.protobuf.ExtensionRegistry; |
|
|
|
import com.google.protobuf.ExtensionRegistry; |
|
|
|
import org.junit.jupiter.api.Test; |
|
|
|
import org.junit.jupiter.api.Test; |
|
|
|
@ -42,6 +43,8 @@ import org.springframework.http.codec.HttpMessageReader; |
|
|
|
import org.springframework.http.codec.HttpMessageWriter; |
|
|
|
import org.springframework.http.codec.HttpMessageWriter; |
|
|
|
import org.springframework.http.codec.ResourceHttpMessageReader; |
|
|
|
import org.springframework.http.codec.ResourceHttpMessageReader; |
|
|
|
import org.springframework.http.codec.ResourceHttpMessageWriter; |
|
|
|
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.Jackson2JsonDecoder; |
|
|
|
import org.springframework.http.codec.json.Jackson2JsonEncoder; |
|
|
|
import org.springframework.http.codec.json.Jackson2JsonEncoder; |
|
|
|
import org.springframework.http.codec.json.Jackson2SmileDecoder; |
|
|
|
import org.springframework.http.codec.json.Jackson2SmileDecoder; |
|
|
|
@ -269,11 +272,68 @@ public class CodecConfigurerTests { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
public void cloneConfigurer() { |
|
|
|
public void cloneCustomCodecs() { |
|
|
|
CodecConfigurer clone = this.configurer.clone(); |
|
|
|
|
|
|
|
this.configurer.registerDefaults(false); |
|
|
|
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()); |
|
|
|
|
|
|
|
|
|
|
|
assertThat(this.configurer.getReaders().size()).isEqualTo(0); |
|
|
|
assertThat(this.configurer.getReaders().size()).isEqualTo(0); |
|
|
|
assertThat(clone.getReaders().size()).isEqualTo(11); |
|
|
|
assertThat(this.configurer.getWriters().size()).isEqualTo(0); |
|
|
|
|
|
|
|
assertThat(clone.getReaders().size()).isEqualTo(2); |
|
|
|
|
|
|
|
assertThat(clone.getWriters().size()).isEqualTo(2); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@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()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assertThat(decoders).contains(jacksonDecoder, jaxb2Decoder, protoDecoder); |
|
|
|
|
|
|
|
assertThat(encoders).contains(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()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assertThat(decoders).doesNotContain(jacksonDecoder, jaxb2Decoder, protoDecoder); |
|
|
|
|
|
|
|
assertThat(encoders).doesNotContain(jacksonEncoder, jaxb2Encoder, protoEncoder); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private Decoder<?> getNextDecoder(List<HttpMessageReader<?>> readers) { |
|
|
|
private Decoder<?> getNextDecoder(List<HttpMessageReader<?>> readers) { |
|
|
|
@ -324,10 +384,21 @@ public class CodecConfigurerTests { |
|
|
|
private static class TestCodecConfigurer extends BaseCodecConfigurer { |
|
|
|
private static class TestCodecConfigurer extends BaseCodecConfigurer { |
|
|
|
|
|
|
|
|
|
|
|
TestCodecConfigurer() { |
|
|
|
TestCodecConfigurer() { |
|
|
|
super(new TestDefaultCodecs()); |
|
|
|
super(new BaseDefaultCodecs()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TestCodecConfigurer(TestCodecConfigurer other) { |
|
|
|
|
|
|
|
super(other); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
protected BaseDefaultCodecs cloneDefaultCodecs() { |
|
|
|
|
|
|
|
return new BaseDefaultCodecs((BaseDefaultCodecs) defaultCodecs()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private static class TestDefaultCodecs extends BaseDefaultCodecs { |
|
|
|
@Override |
|
|
|
|
|
|
|
public CodecConfigurer clone() { |
|
|
|
|
|
|
|
return new TestCodecConfigurer(this); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|