Skip to content

Commit 45812cb

Browse files
committed
Prefer Jackson XML codecs when present
Closes gh-36776
1 parent 95bd3f7 commit 45812cb

4 files changed

Lines changed: 40 additions & 38 deletions

File tree

spring-web/src/main/java/org/springframework/http/codec/support/BaseDefaultCodecs.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -675,13 +675,14 @@ else if (GSON_PRESENT) {
675675
if (JACKSON_CBOR_PRESENT || JACKSON_2_CBOR_PRESENT) {
676676
addCodec(this.objectReaders, new DecoderHttpMessageReader<>(getJacksonCborDecoder()));
677677
}
678-
if (JAXB_2_PRESENT) {
678+
// Jackson supports Jackson and JAXB annotations, prefer it if present
679+
if (JACKSON_XML_PRESENT) {
680+
addCodec(this.objectReaders, new DecoderHttpMessageReader<>(getJacksonXmlDecoder()));
681+
}
682+
else if (JAXB_2_PRESENT) {
679683
addCodec(this.objectReaders, new DecoderHttpMessageReader<>(this.jaxb2Decoder != null ?
680684
(Jaxb2XmlDecoder) this.jaxb2Decoder : new Jaxb2XmlDecoder()));
681685
}
682-
else if(JACKSON_XML_PRESENT) {
683-
addCodec(this.objectReaders, new DecoderHttpMessageReader<>(getJacksonXmlDecoder()));
684-
}
685686
if (KOTLIN_SERIALIZATION_PROTOBUF_PRESENT) {
686687
addCodec(this.objectReaders,
687688
new DecoderHttpMessageReader<>(getKotlinSerializationProtobufDecoder()));
@@ -817,13 +818,14 @@ else if (GSON_PRESENT) {
817818
if (JACKSON_CBOR_PRESENT || JACKSON_2_CBOR_PRESENT) {
818819
addCodec(writers, new EncoderHttpMessageWriter<>(getJacksonCborEncoder()));
819820
}
820-
if (JAXB_2_PRESENT) {
821+
// Jackson supports Jackson and JAXB annotations, prefer it if present
822+
if (JACKSON_XML_PRESENT) {
823+
addCodec(writers, new EncoderHttpMessageWriter<>(getJacksonXmlEncoder()));
824+
}
825+
else if (JAXB_2_PRESENT) {
821826
addCodec(writers, new EncoderHttpMessageWriter<>(this.jaxb2Encoder != null ?
822827
(Jaxb2XmlEncoder) this.jaxb2Encoder : new Jaxb2XmlEncoder()));
823828
}
824-
else if (JACKSON_XML_PRESENT) {
825-
addCodec(writers, new EncoderHttpMessageWriter<>(getJacksonXmlEncoder()));
826-
}
827829
if (KOTLIN_SERIALIZATION_PROTOBUF_PRESENT) {
828830
addCodec(writers, new EncoderHttpMessageWriter<>(getKotlinSerializationProtobufEncoder()));
829831
}

spring-web/src/test/java/org/springframework/http/codec/support/ClientCodecConfigurerTests.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@
7272
import org.springframework.http.codec.protobuf.ProtobufHttpMessageWriter;
7373
import org.springframework.http.codec.smile.JacksonSmileDecoder;
7474
import org.springframework.http.codec.smile.JacksonSmileEncoder;
75-
import org.springframework.http.codec.xml.Jaxb2XmlDecoder;
76-
import org.springframework.http.codec.xml.Jaxb2XmlEncoder;
75+
import org.springframework.http.codec.xml.JacksonXmlDecoder;
76+
import org.springframework.http.codec.xml.JacksonXmlEncoder;
7777
import org.springframework.util.MimeTypeUtils;
7878

7979
import static org.assertj.core.api.Assertions.assertThat;
@@ -113,7 +113,7 @@ void defaultReaders() {
113113
assertThat(getNextDecoder(readers).getClass()).isEqualTo(JacksonSmileDecoder.class);
114114
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationCborDecoder.class);
115115
assertThat(getNextDecoder(readers).getClass()).isEqualTo(JacksonCborDecoder.class);
116-
assertThat(getNextDecoder(readers).getClass()).isEqualTo(Jaxb2XmlDecoder.class);
116+
assertThat(getNextDecoder(readers).getClass()).isEqualTo(JacksonXmlDecoder.class);
117117
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationProtobufDecoder.class);
118118
assertSseReader(readers);
119119
assertStringDecoder(getNextDecoder(readers), false);
@@ -138,7 +138,7 @@ void defaultWriters() {
138138
assertThat(getNextEncoder(writers).getClass()).isEqualTo(JacksonSmileEncoder.class);
139139
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationCborEncoder.class);
140140
assertThat(getNextEncoder(writers).getClass()).isEqualTo(JacksonCborEncoder.class);
141-
assertThat(getNextEncoder(writers).getClass()).isEqualTo(Jaxb2XmlEncoder.class);
141+
assertThat(getNextEncoder(writers).getClass()).isEqualTo(JacksonXmlEncoder.class);
142142
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationProtobufEncoder.class);
143143
assertStringEncoder(getNextEncoder(writers), false);
144144
}
@@ -186,7 +186,7 @@ void maxInMemorySize() {
186186
assertThat(((JacksonSmileDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
187187
assertThat(((KotlinSerializationCborDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
188188
assertThat(((JacksonCborDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
189-
assertThat(((Jaxb2XmlDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
189+
assertThat(((JacksonXmlDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
190190
assertThat(((KotlinSerializationProtobufDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
191191

192192
ServerSentEventHttpMessageReader reader = (ServerSentEventHttpMessageReader) nextReader(readers);

spring-web/src/test/java/org/springframework/http/codec/support/CodecConfigurerTests.java

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@
6868
import org.springframework.http.codec.protobuf.ProtobufHttpMessageWriter;
6969
import org.springframework.http.codec.smile.JacksonSmileDecoder;
7070
import org.springframework.http.codec.smile.JacksonSmileEncoder;
71-
import org.springframework.http.codec.xml.Jaxb2XmlDecoder;
72-
import org.springframework.http.codec.xml.Jaxb2XmlEncoder;
71+
import org.springframework.http.codec.xml.JacksonXmlDecoder;
72+
import org.springframework.http.codec.xml.JacksonXmlEncoder;
7373
import org.springframework.util.MimeTypeUtils;
7474

7575
import static org.assertj.core.api.Assertions.assertThat;
@@ -109,7 +109,7 @@ void defaultReaders() {
109109
assertThat(getNextDecoder(readers).getClass()).isEqualTo(JacksonSmileDecoder.class);
110110
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationCborDecoder.class);
111111
assertThat(getNextDecoder(readers).getClass()).isEqualTo(JacksonCborDecoder.class);
112-
assertThat(getNextDecoder(readers).getClass()).isEqualTo(Jaxb2XmlDecoder.class);
112+
assertThat(getNextDecoder(readers).getClass()).isEqualTo(JacksonXmlDecoder.class);
113113
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationProtobufDecoder.class);
114114
assertStringDecoder(getNextDecoder(readers), false);
115115
}
@@ -133,7 +133,7 @@ void defaultWriters() {
133133
assertThat(getNextEncoder(writers).getClass()).isEqualTo(JacksonSmileEncoder.class);
134134
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationCborEncoder.class);
135135
assertThat(getNextEncoder(writers).getClass()).isEqualTo(JacksonCborEncoder.class);
136-
assertThat(getNextEncoder(writers).getClass()).isEqualTo(Jaxb2XmlEncoder.class);
136+
assertThat(getNextEncoder(writers).getClass()).isEqualTo(JacksonXmlEncoder.class);
137137
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationProtobufEncoder.class);
138138
assertStringEncoder(getNextEncoder(writers), false);
139139
}
@@ -181,7 +181,7 @@ void defaultAndCustomReaders() {
181181
assertThat(getNextDecoder(readers).getClass()).isEqualTo(JacksonSmileDecoder.class);
182182
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationCborDecoder.class);
183183
assertThat(getNextDecoder(readers).getClass()).isEqualTo(JacksonCborDecoder.class);
184-
assertThat(getNextDecoder(readers).getClass()).isEqualTo(Jaxb2XmlDecoder.class);
184+
assertThat(getNextDecoder(readers).getClass()).isEqualTo(JacksonXmlDecoder.class);
185185
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationProtobufDecoder.class);
186186
assertThat(getNextDecoder(readers).getClass()).isEqualTo(StringDecoder.class);
187187
}
@@ -228,7 +228,7 @@ void defaultAndCustomWriters() {
228228
assertThat(getNextEncoder(writers).getClass()).isEqualTo(JacksonSmileEncoder.class);
229229
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationCborEncoder.class);
230230
assertThat(getNextEncoder(writers).getClass()).isEqualTo(JacksonCborEncoder.class);
231-
assertThat(getNextEncoder(writers).getClass()).isEqualTo(Jaxb2XmlEncoder.class);
231+
assertThat(getNextEncoder(writers).getClass()).isEqualTo(JacksonXmlEncoder.class);
232232
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationProtobufEncoder.class);
233233
assertThat(getNextEncoder(writers).getClass()).isEqualTo(CharSequenceEncoder.class);
234234
}
@@ -303,26 +303,26 @@ void encoderDecoderOverrides() {
303303
JacksonSmileEncoder smileEncoder = new JacksonSmileEncoder();
304304
ProtobufDecoder protobufDecoder = new ProtobufDecoder(ExtensionRegistry.newInstance());
305305
ProtobufEncoder protobufEncoder = new ProtobufEncoder();
306-
Jaxb2XmlEncoder jaxb2Encoder = new Jaxb2XmlEncoder();
307-
Jaxb2XmlDecoder jaxb2Decoder = new Jaxb2XmlDecoder();
306+
JacksonXmlEncoder jacksonXmlEncoder = new JacksonXmlEncoder();
307+
JacksonXmlDecoder jacksonXmlDecoder = new JacksonXmlDecoder();
308308

309309
this.configurer.defaultCodecs().jacksonJsonDecoder(jacksonDecoder);
310310
this.configurer.defaultCodecs().jacksonJsonEncoder(jacksonEncoder);
311311
this.configurer.defaultCodecs().jacksonSmileDecoder(smileDecoder);
312312
this.configurer.defaultCodecs().jacksonSmileEncoder(smileEncoder);
313313
this.configurer.defaultCodecs().protobufDecoder(protobufDecoder);
314314
this.configurer.defaultCodecs().protobufEncoder(protobufEncoder);
315-
this.configurer.defaultCodecs().jaxb2Decoder(jaxb2Decoder);
316-
this.configurer.defaultCodecs().jaxb2Encoder(jaxb2Encoder);
315+
this.configurer.defaultCodecs().jacksonXmlDecoder(jacksonXmlDecoder);
316+
this.configurer.defaultCodecs().jacksonXmlEncoder(jacksonXmlEncoder);
317317

318318
assertDecoderInstance(jacksonDecoder);
319319
assertDecoderInstance(smileDecoder);
320320
assertDecoderInstance(protobufDecoder);
321-
assertDecoderInstance(jaxb2Decoder);
321+
assertDecoderInstance(jacksonXmlDecoder);
322322
assertEncoderInstance(jacksonEncoder);
323323
assertEncoderInstance(smileEncoder);
324324
assertEncoderInstance(protobufEncoder);
325-
assertEncoderInstance(jaxb2Encoder);
325+
assertEncoderInstance(jacksonXmlEncoder);
326326
}
327327

328328
@Test
@@ -369,15 +369,15 @@ void cloneDefaultCodecs() {
369369

370370
JacksonJsonDecoder jacksonDecoder = new JacksonJsonDecoder();
371371
JacksonJsonEncoder jacksonEncoder = new JacksonJsonEncoder();
372-
Jaxb2XmlDecoder jaxb2Decoder = new Jaxb2XmlDecoder();
373-
Jaxb2XmlEncoder jaxb2Encoder = new Jaxb2XmlEncoder();
372+
JacksonXmlDecoder jacksonXmlDecoder = new JacksonXmlDecoder();
373+
JacksonXmlEncoder jacksonXmlEncoder = new JacksonXmlEncoder();
374374
ProtobufDecoder protoDecoder = new ProtobufDecoder();
375375
ProtobufEncoder protoEncoder = new ProtobufEncoder();
376376

377377
clone.defaultCodecs().jacksonJsonDecoder(jacksonDecoder);
378378
clone.defaultCodecs().jacksonJsonEncoder(jacksonEncoder);
379-
clone.defaultCodecs().jaxb2Decoder(jaxb2Decoder);
380-
clone.defaultCodecs().jaxb2Encoder(jaxb2Encoder);
379+
clone.defaultCodecs().jacksonXmlDecoder(jacksonXmlDecoder);
380+
clone.defaultCodecs().jacksonXmlEncoder(jacksonXmlEncoder);
381381
clone.defaultCodecs().protobufDecoder(protoDecoder);
382382
clone.defaultCodecs().protobufEncoder(protoEncoder);
383383

@@ -393,8 +393,8 @@ void cloneDefaultCodecs() {
393393
.map(reader -> ((EncoderHttpMessageWriter<?>) reader).getEncoder())
394394
.collect(Collectors.toList());
395395

396-
assertThat(decoders).contains(jacksonDecoder, jaxb2Decoder, protoDecoder);
397-
assertThat(encoders).contains(jacksonEncoder, jaxb2Encoder, protoEncoder);
396+
assertThat(decoders).contains(jacksonDecoder, jacksonXmlDecoder, protoDecoder);
397+
assertThat(encoders).contains(jacksonEncoder, jacksonXmlEncoder, protoEncoder);
398398

399399
// Original does not have the customizations
400400

@@ -408,8 +408,8 @@ void cloneDefaultCodecs() {
408408
.map(reader -> ((EncoderHttpMessageWriter<?>) reader).getEncoder())
409409
.collect(Collectors.toList());
410410

411-
assertThat(decoders).doesNotContain(jacksonDecoder, jaxb2Decoder, protoDecoder);
412-
assertThat(encoders).doesNotContain(jacksonEncoder, jaxb2Encoder, protoEncoder);
411+
assertThat(decoders).doesNotContain(jacksonDecoder, jacksonXmlDecoder, protoDecoder);
412+
assertThat(encoders).doesNotContain(jacksonEncoder, jacksonXmlEncoder, protoEncoder);
413413
}
414414

415415
private Decoder<?> getNextDecoder(List<HttpMessageReader<?>> readers) {

spring-web/src/test/java/org/springframework/http/codec/support/ServerCodecConfigurerTests.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@
7272
import org.springframework.http.codec.protobuf.ProtobufHttpMessageWriter;
7373
import org.springframework.http.codec.smile.JacksonSmileDecoder;
7474
import org.springframework.http.codec.smile.JacksonSmileEncoder;
75-
import org.springframework.http.codec.xml.Jaxb2XmlDecoder;
76-
import org.springframework.http.codec.xml.Jaxb2XmlEncoder;
75+
import org.springframework.http.codec.xml.JacksonXmlDecoder;
76+
import org.springframework.http.codec.xml.JacksonXmlEncoder;
7777
import org.springframework.util.MimeTypeUtils;
7878

7979
import static org.assertj.core.api.Assertions.assertThat;
@@ -112,7 +112,7 @@ void defaultReaders() {
112112
assertThat(getNextDecoder(readers).getClass()).isEqualTo(JacksonSmileDecoder.class);
113113
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationCborDecoder.class);
114114
assertThat(getNextDecoder(readers).getClass()).isEqualTo(JacksonCborDecoder.class);
115-
assertThat(getNextDecoder(readers).getClass()).isEqualTo(Jaxb2XmlDecoder.class);
115+
assertThat(getNextDecoder(readers).getClass()).isEqualTo(JacksonXmlDecoder.class);
116116
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationProtobufDecoder.class);
117117
assertStringDecoder(getNextDecoder(readers), false);
118118
}
@@ -136,7 +136,7 @@ void defaultWriters() {
136136
assertThat(getNextEncoder(writers).getClass()).isEqualTo(JacksonSmileEncoder.class);
137137
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationCborEncoder.class);
138138
assertThat(getNextEncoder(writers).getClass()).isEqualTo(JacksonCborEncoder.class);
139-
assertThat(getNextEncoder(writers).getClass()).isEqualTo(Jaxb2XmlEncoder.class);
139+
assertThat(getNextEncoder(writers).getClass()).isEqualTo(JacksonXmlEncoder.class);
140140
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationProtobufEncoder.class);
141141
assertSseWriter(writers);
142142
assertStringEncoder(getNextEncoder(writers), false);
@@ -185,7 +185,7 @@ void maxInMemorySize() {
185185
assertThat(((JacksonSmileDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
186186
assertThat(((KotlinSerializationCborDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
187187
assertThat(((JacksonCborDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
188-
assertThat(((Jaxb2XmlDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
188+
assertThat(((JacksonXmlDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
189189
assertThat(((KotlinSerializationProtobufDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
190190
assertThat(((StringDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
191191
}

0 commit comments

Comments
 (0)