Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -679,7 +679,7 @@ else if (GSON_PRESENT) {
addCodec(this.objectReaders, new DecoderHttpMessageReader<>(this.jaxb2Decoder != null ?
(Jaxb2XmlDecoder) this.jaxb2Decoder : new Jaxb2XmlDecoder()));
}
else if(JACKSON_XML_PRESENT) {
if (JACKSON_XML_PRESENT) {
addCodec(this.objectReaders, new DecoderHttpMessageReader<>(getJacksonXmlDecoder()));
}
if (KOTLIN_SERIALIZATION_PROTOBUF_PRESENT) {
Expand Down Expand Up @@ -821,7 +821,7 @@ else if (GSON_PRESENT) {
addCodec(writers, new EncoderHttpMessageWriter<>(this.jaxb2Encoder != null ?
(Jaxb2XmlEncoder) this.jaxb2Encoder : new Jaxb2XmlEncoder()));
}
else if (JACKSON_XML_PRESENT) {
if (JACKSON_XML_PRESENT) {
addCodec(writers, new EncoderHttpMessageWriter<>(getJacksonXmlEncoder()));
}
if (KOTLIN_SERIALIZATION_PROTOBUF_PRESENT) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,11 @@ public JacksonXmlDecoder(XmlMapper mapper, MimeType... mimeTypes) {
}


@Override
public boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType) {
return super.canDecode(elementType, mimeType) && !CharSequence.class.isAssignableFrom(elementType.toClass());
}

@Override
public Flux<Object> decode(Publisher<DataBuffer> input, ResolvableType elementType, @Nullable MimeType mimeType,
@Nullable Map<String, Object> hints) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,11 @@ public JacksonXmlEncoder(XmlMapper mapper, MimeType... mimeTypes) {
}


@Override
public boolean canEncode(ResolvableType elementType, @Nullable MimeType mimeType) {
return super.canEncode(elementType, mimeType) && !String.class.isAssignableFrom(elementType.toClass());
}

@Override
public Flux<DataBuffer> encode(Publisher<?> inputStream, DataBufferFactory bufferFactory, ResolvableType elementType,
@Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@
import org.springframework.http.codec.protobuf.ProtobufHttpMessageWriter;
import org.springframework.http.codec.smile.JacksonSmileDecoder;
import org.springframework.http.codec.smile.JacksonSmileEncoder;
import org.springframework.http.codec.xml.JacksonXmlDecoder;
import org.springframework.http.codec.xml.JacksonXmlEncoder;
import org.springframework.http.codec.xml.Jaxb2XmlDecoder;
import org.springframework.http.codec.xml.Jaxb2XmlEncoder;
import org.springframework.util.MimeTypeUtils;
Expand All @@ -95,7 +97,7 @@ class ClientCodecConfigurerTests {
@Test
void defaultReaders() {
List<HttpMessageReader<?>> readers = this.configurer.getReaders();
assertThat(readers).hasSize(20);
assertThat(readers).hasSize(21);
assertThat(getNextDecoder(readers).getClass()).isEqualTo(ByteArrayDecoder.class);
assertThat(getNextDecoder(readers).getClass()).isEqualTo(ByteBufferDecoder.class);
assertThat(getNextDecoder(readers).getClass()).isEqualTo(DataBufferDecoder.class);
Expand All @@ -114,6 +116,7 @@ void defaultReaders() {
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationCborDecoder.class);
assertThat(getNextDecoder(readers).getClass()).isEqualTo(JacksonCborDecoder.class);
assertThat(getNextDecoder(readers).getClass()).isEqualTo(Jaxb2XmlDecoder.class);
assertThat(getNextDecoder(readers).getClass()).isEqualTo(JacksonXmlDecoder.class);
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationProtobufDecoder.class);
assertSseReader(readers);
assertStringDecoder(getNextDecoder(readers), false);
Expand All @@ -122,7 +125,7 @@ void defaultReaders() {
@Test
void defaultWriters() {
List<HttpMessageWriter<?>> writers = this.configurer.getWriters();
assertThat(writers).hasSize(18);
assertThat(writers).hasSize(19);
assertThat(getNextEncoder(writers).getClass()).isEqualTo(ByteArrayEncoder.class);
assertThat(getNextEncoder(writers).getClass()).isEqualTo(ByteBufferEncoder.class);
assertThat(getNextEncoder(writers).getClass()).isEqualTo(DataBufferEncoder.class);
Expand All @@ -139,6 +142,7 @@ void defaultWriters() {
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationCborEncoder.class);
assertThat(getNextEncoder(writers).getClass()).isEqualTo(JacksonCborEncoder.class);
assertThat(getNextEncoder(writers).getClass()).isEqualTo(Jaxb2XmlEncoder.class);
assertThat(getNextEncoder(writers).getClass()).isEqualTo(JacksonXmlEncoder.class);
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationProtobufEncoder.class);
assertStringEncoder(getNextEncoder(writers), false);
}
Expand All @@ -147,29 +151,36 @@ void defaultWriters() {
void jacksonCodecCustomization() {
JacksonJsonDecoder decoder = new JacksonJsonDecoder();
JacksonJsonEncoder encoder = new JacksonJsonEncoder();
JacksonXmlDecoder xmlDecoder = new JacksonXmlDecoder();
JacksonXmlEncoder xmlEncoder = new JacksonXmlEncoder();
this.configurer.defaultCodecs().jacksonJsonDecoder(decoder);
this.configurer.defaultCodecs().jacksonJsonEncoder(encoder);
this.configurer.defaultCodecs().jacksonXmlDecoder(xmlDecoder);
this.configurer.defaultCodecs().jacksonXmlEncoder(xmlEncoder);

List<HttpMessageReader<?>> readers = this.configurer.getReaders();
JacksonJsonDecoder actualDecoder = findCodec(readers, JacksonJsonDecoder.class);
assertThat(actualDecoder).isSameAs(decoder);
assertThat(findCodec(readers, JacksonXmlDecoder.class)).isSameAs(xmlDecoder);
assertThat(findCodec(readers, ServerSentEventHttpMessageReader.class).getDecoder()).isSameAs(decoder);

List<HttpMessageWriter<?>> writers = this.configurer.getWriters();
JacksonJsonEncoder actualEncoder = findCodec(writers, JacksonJsonEncoder.class);
assertThat(actualEncoder).isSameAs(encoder);
assertThat(findCodec(writers, JacksonXmlEncoder.class)).isSameAs(xmlEncoder);

MultipartHttpMessageWriter multipartWriter = findCodec(writers, MultipartHttpMessageWriter.class);
actualEncoder = findCodec(multipartWriter.getPartWriters(), JacksonJsonEncoder.class);
assertThat(actualEncoder).isSameAs(encoder);
assertThat(findCodec(multipartWriter.getPartWriters(), JacksonXmlEncoder.class)).isSameAs(xmlEncoder);
}

@Test
void maxInMemorySize() {
int size = 99;
this.configurer.defaultCodecs().maxInMemorySize(size);
List<HttpMessageReader<?>> readers = this.configurer.getReaders();
assertThat(readers).hasSize(20);
assertThat(readers).hasSize(21);
assertThat(((ByteArrayDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
assertThat(((ByteBufferDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
assertThat(((DataBufferDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
Expand All @@ -187,6 +198,7 @@ void maxInMemorySize() {
assertThat(((KotlinSerializationCborDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
assertThat(((JacksonCborDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
assertThat(((Jaxb2XmlDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
assertThat(((JacksonXmlDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
assertThat(((KotlinSerializationProtobufDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);

ServerSentEventHttpMessageReader reader = (ServerSentEventHttpMessageReader) nextReader(readers);
Expand Down Expand Up @@ -232,7 +244,7 @@ void clonedConfigurer() {
writers = findCodec(this.configurer.getWriters(), MultipartHttpMessageWriter.class).getPartWriters();

assertThat(sseDecoder).isNotSameAs(jacksonDecoder);
assertThat(writers).hasSize(18);
assertThat(writers).hasSize(19);
}

@Test // gh-24194
Expand All @@ -242,7 +254,7 @@ void cloneShouldNotDropMultipartCodecs() {
List<HttpMessageWriter<?>> writers =
findCodec(clone.getWriters(), MultipartHttpMessageWriter.class).getPartWriters();

assertThat(writers).hasSize(18);
assertThat(writers).hasSize(19);
}

@Test
Expand All @@ -256,7 +268,7 @@ void cloneShouldNotBeImpactedByChangesToOriginal() {
List<HttpMessageWriter<?>> writers =
findCodec(clone.getWriters(), MultipartHttpMessageWriter.class).getPartWriters();

assertThat(writers).hasSize(18);
assertThat(writers).hasSize(19);
}

private Decoder<?> getNextDecoder(List<HttpMessageReader<?>> readers) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@
import org.springframework.http.codec.protobuf.ProtobufHttpMessageWriter;
import org.springframework.http.codec.smile.JacksonSmileDecoder;
import org.springframework.http.codec.smile.JacksonSmileEncoder;
import org.springframework.http.codec.xml.JacksonXmlDecoder;
import org.springframework.http.codec.xml.JacksonXmlEncoder;
import org.springframework.http.codec.xml.Jaxb2XmlDecoder;
import org.springframework.http.codec.xml.Jaxb2XmlEncoder;
import org.springframework.util.MimeTypeUtils;
Expand All @@ -92,7 +94,7 @@ class CodecConfigurerTests {
@Test
void defaultReaders() {
List<HttpMessageReader<?>> readers = this.configurer.getReaders();
assertThat(readers).hasSize(19);
assertThat(readers).hasSize(20);
assertThat(getNextDecoder(readers).getClass()).isEqualTo(ByteArrayDecoder.class);
assertThat(getNextDecoder(readers).getClass()).isEqualTo(ByteBufferDecoder.class);
assertThat(getNextDecoder(readers).getClass()).isEqualTo(DataBufferDecoder.class);
Expand All @@ -110,14 +112,15 @@ void defaultReaders() {
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationCborDecoder.class);
assertThat(getNextDecoder(readers).getClass()).isEqualTo(JacksonCborDecoder.class);
assertThat(getNextDecoder(readers).getClass()).isEqualTo(Jaxb2XmlDecoder.class);
assertThat(getNextDecoder(readers).getClass()).isEqualTo(JacksonXmlDecoder.class);
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationProtobufDecoder.class);
assertStringDecoder(getNextDecoder(readers), false);
}

@Test
void defaultWriters() {
List<HttpMessageWriter<?>> writers = this.configurer.getWriters();
assertThat(writers).hasSize(18);
assertThat(writers).hasSize(19);
assertThat(getNextEncoder(writers).getClass()).isEqualTo(ByteArrayEncoder.class);
assertThat(getNextEncoder(writers).getClass()).isEqualTo(ByteBufferEncoder.class);
assertThat(getNextEncoder(writers).getClass()).isEqualTo(DataBufferEncoder.class);
Expand All @@ -134,6 +137,7 @@ void defaultWriters() {
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationCborEncoder.class);
assertThat(getNextEncoder(writers).getClass()).isEqualTo(JacksonCborEncoder.class);
assertThat(getNextEncoder(writers).getClass()).isEqualTo(Jaxb2XmlEncoder.class);
assertThat(getNextEncoder(writers).getClass()).isEqualTo(JacksonXmlEncoder.class);
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationProtobufEncoder.class);
assertStringEncoder(getNextEncoder(writers), false);
}
Expand All @@ -160,7 +164,7 @@ void defaultAndCustomReaders() {

List<HttpMessageReader<?>> readers = this.configurer.getReaders();

assertThat(readers).hasSize(23);
assertThat(readers).hasSize(24);
assertThat(getNextDecoder(readers)).isSameAs(customDecoder1);
assertThat(readers.get(this.index.getAndIncrement())).isSameAs(customReader1);
assertThat(getNextDecoder(readers).getClass()).isEqualTo(ByteArrayDecoder.class);
Expand All @@ -182,6 +186,7 @@ void defaultAndCustomReaders() {
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationCborDecoder.class);
assertThat(getNextDecoder(readers).getClass()).isEqualTo(JacksonCborDecoder.class);
assertThat(getNextDecoder(readers).getClass()).isEqualTo(Jaxb2XmlDecoder.class);
assertThat(getNextDecoder(readers).getClass()).isEqualTo(JacksonXmlDecoder.class);
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationProtobufDecoder.class);
assertThat(getNextDecoder(readers).getClass()).isEqualTo(StringDecoder.class);
}
Expand All @@ -208,7 +213,7 @@ void defaultAndCustomWriters() {

List<HttpMessageWriter<?>> writers = this.configurer.getWriters();

assertThat(writers).hasSize(22);
assertThat(writers).hasSize(23);
assertThat(getNextEncoder(writers)).isSameAs(customEncoder1);
assertThat(writers.get(this.index.getAndIncrement())).isSameAs(customWriter1);
assertThat(getNextEncoder(writers).getClass()).isEqualTo(ByteArrayEncoder.class);
Expand All @@ -229,6 +234,7 @@ void defaultAndCustomWriters() {
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationCborEncoder.class);
assertThat(getNextEncoder(writers).getClass()).isEqualTo(JacksonCborEncoder.class);
assertThat(getNextEncoder(writers).getClass()).isEqualTo(Jaxb2XmlEncoder.class);
assertThat(getNextEncoder(writers).getClass()).isEqualTo(JacksonXmlEncoder.class);
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationProtobufEncoder.class);
assertThat(getNextEncoder(writers).getClass()).isEqualTo(CharSequenceEncoder.class);
}
Expand Down Expand Up @@ -299,6 +305,8 @@ void defaultsOffWithCustomWriters() {
void encoderDecoderOverrides() {
JacksonJsonDecoder jacksonDecoder = new JacksonJsonDecoder();
JacksonJsonEncoder jacksonEncoder = new JacksonJsonEncoder();
JacksonXmlDecoder jacksonXmlDecoder = new JacksonXmlDecoder();
JacksonXmlEncoder jacksonXmlEncoder = new JacksonXmlEncoder();
JacksonSmileDecoder smileDecoder = new JacksonSmileDecoder();
JacksonSmileEncoder smileEncoder = new JacksonSmileEncoder();
ProtobufDecoder protobufDecoder = new ProtobufDecoder(ExtensionRegistry.newInstance());
Expand All @@ -308,6 +316,8 @@ void encoderDecoderOverrides() {

this.configurer.defaultCodecs().jacksonJsonDecoder(jacksonDecoder);
this.configurer.defaultCodecs().jacksonJsonEncoder(jacksonEncoder);
this.configurer.defaultCodecs().jacksonXmlDecoder(jacksonXmlDecoder);
this.configurer.defaultCodecs().jacksonXmlEncoder(jacksonXmlEncoder);
this.configurer.defaultCodecs().jacksonSmileDecoder(smileDecoder);
this.configurer.defaultCodecs().jacksonSmileEncoder(smileEncoder);
this.configurer.defaultCodecs().protobufDecoder(protobufDecoder);
Expand All @@ -316,10 +326,12 @@ void encoderDecoderOverrides() {
this.configurer.defaultCodecs().jaxb2Encoder(jaxb2Encoder);

assertDecoderInstance(jacksonDecoder);
assertDecoderInstance(jacksonXmlDecoder);
assertDecoderInstance(smileDecoder);
assertDecoderInstance(protobufDecoder);
assertDecoderInstance(jaxb2Decoder);
assertEncoderInstance(jacksonEncoder);
assertEncoderInstance(jacksonXmlEncoder);
assertEncoderInstance(smileEncoder);
assertEncoderInstance(protobufEncoder);
assertEncoderInstance(jaxb2Encoder);
Expand Down Expand Up @@ -369,13 +381,17 @@ void cloneDefaultCodecs() {

JacksonJsonDecoder jacksonDecoder = new JacksonJsonDecoder();
JacksonJsonEncoder jacksonEncoder = new JacksonJsonEncoder();
JacksonXmlDecoder jacksonXmlDecoder = new JacksonXmlDecoder();
JacksonXmlEncoder jacksonXmlEncoder = new JacksonXmlEncoder();
Jaxb2XmlDecoder jaxb2Decoder = new Jaxb2XmlDecoder();
Jaxb2XmlEncoder jaxb2Encoder = new Jaxb2XmlEncoder();
ProtobufDecoder protoDecoder = new ProtobufDecoder();
ProtobufEncoder protoEncoder = new ProtobufEncoder();

clone.defaultCodecs().jacksonJsonDecoder(jacksonDecoder);
clone.defaultCodecs().jacksonJsonEncoder(jacksonEncoder);
clone.defaultCodecs().jacksonXmlDecoder(jacksonXmlDecoder);
clone.defaultCodecs().jacksonXmlEncoder(jacksonXmlEncoder);
clone.defaultCodecs().jaxb2Decoder(jaxb2Decoder);
clone.defaultCodecs().jaxb2Encoder(jaxb2Encoder);
clone.defaultCodecs().protobufDecoder(protoDecoder);
Expand All @@ -393,8 +409,8 @@ void cloneDefaultCodecs() {
.map(reader -> ((EncoderHttpMessageWriter<?>) reader).getEncoder())
.collect(Collectors.toList());

assertThat(decoders).contains(jacksonDecoder, jaxb2Decoder, protoDecoder);
assertThat(encoders).contains(jacksonEncoder, jaxb2Encoder, protoEncoder);
assertThat(decoders).contains(jacksonDecoder, jacksonXmlDecoder, jaxb2Decoder, protoDecoder);
assertThat(encoders).contains(jacksonEncoder, jacksonXmlEncoder, jaxb2Encoder, protoEncoder);

// Original does not have the customizations

Expand All @@ -408,8 +424,8 @@ void cloneDefaultCodecs() {
.map(reader -> ((EncoderHttpMessageWriter<?>) reader).getEncoder())
.collect(Collectors.toList());

assertThat(decoders).doesNotContain(jacksonDecoder, jaxb2Decoder, protoDecoder);
assertThat(encoders).doesNotContain(jacksonEncoder, jaxb2Encoder, protoEncoder);
assertThat(decoders).doesNotContain(jacksonDecoder, jacksonXmlDecoder, jaxb2Decoder, protoDecoder);
assertThat(encoders).doesNotContain(jacksonEncoder, jacksonXmlEncoder, jaxb2Encoder, protoEncoder);
}

private Decoder<?> getNextDecoder(List<HttpMessageReader<?>> readers) {
Expand Down
Loading