Skip to content

Commit 7077809

Browse files
committed
Configure Kotlin JSON converters as Jackson alternative
Prior to this commit, Spring MVC and WebFlux would consider the "kotlinx.serialization" JSON codecs and converters in addition to other JSON alternatives like Jackson, Gson and Jsonb. This would cause issues because while in most cases this library is only involved if the type is annotated with "@serializable", this is not true for Java enums. In this particular case, the codec shadows Jackson and causes issues. This commit now considers kotlinx.serialization JSON support as an alternative to Jackson. Just like Jsonb and GSON, this is only auto-detected if Jackson is not present. We received consistent feedback that kotlinx.serialization is popular in Kotlin libraries and is often a transitive dependency. As a result, we cannot consider its presence on the classpath as a strong enough signal to configure it by default. Closes gh-34410
1 parent 6ded25b commit 7077809

File tree

8 files changed

+30
-41
lines changed

8 files changed

+30
-41
lines changed

framework-docs/modules/ROOT/pages/web/webmvc/message-converters.adoc

+5
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ You can customize XML mapping as needed through the use of JAXB or Jackson's pro
5454
When you need further control (for cases where custom XML serializers/deserializers need to be provided for specific types), you can inject a custom `XmlMapper` through the `ObjectMapper` property.
5555
By default, this converter supports `application/xml`. This requires the `com.fasterxml.jackson.dataformat:jackson-dataformat-xml` dependency.
5656

57+
| `KotlinSerializationJsonHttpMessageConverter`
58+
| An `HttpMessageConverter` implementation that can read and write JSON using `kotlinx.serialization`.
59+
This converter is not configured by default, as this conflicts with Jackson.
60+
Developers must configure it as an additional converter ahead of the Jackson one.
61+
5762
| `MappingJackson2CborHttpMessageConverter`
5863
| `com.fasterxml.jackson.dataformat:jackson-dataformat-cbor`
5964

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

+6-6
Original file line numberDiff line numberDiff line change
@@ -575,9 +575,6 @@ protected void initObjectReaders() {
575575
(KotlinSerializationCborDecoder) this.kotlinSerializationCborDecoder :
576576
new KotlinSerializationCborDecoder()));
577577
}
578-
if (kotlinSerializationJsonPresent) {
579-
addCodec(this.objectReaders, new DecoderHttpMessageReader<>(getKotlinSerializationJsonDecoder()));
580-
}
581578
if (kotlinSerializationProtobufPresent) {
582579
addCodec(this.objectReaders,
583580
new DecoderHttpMessageReader<>(this.kotlinSerializationProtobufDecoder != null ?
@@ -587,6 +584,9 @@ protected void initObjectReaders() {
587584
if (jackson2Present) {
588585
addCodec(this.objectReaders, new DecoderHttpMessageReader<>(getJackson2JsonDecoder()));
589586
}
587+
else if (kotlinSerializationJsonPresent) {
588+
addCodec(this.objectReaders, new DecoderHttpMessageReader<>(getKotlinSerializationJsonDecoder()));
589+
}
590590
if (jackson2SmilePresent) {
591591
addCodec(this.objectReaders, new DecoderHttpMessageReader<>(this.jackson2SmileDecoder != null ?
592592
(Jackson2SmileDecoder) this.jackson2SmileDecoder : new Jackson2SmileDecoder()));
@@ -713,9 +713,6 @@ final List<HttpMessageWriter<?>> getBaseObjectWriters() {
713713
(KotlinSerializationCborEncoder) this.kotlinSerializationCborEncoder :
714714
new KotlinSerializationCborEncoder()));
715715
}
716-
if (kotlinSerializationJsonPresent) {
717-
addCodec(writers, new EncoderHttpMessageWriter<>(getKotlinSerializationJsonEncoder()));
718-
}
719716
if (kotlinSerializationProtobufPresent) {
720717
addCodec(writers, new EncoderHttpMessageWriter<>(this.kotlinSerializationProtobufEncoder != null ?
721718
(KotlinSerializationProtobufEncoder) this.kotlinSerializationProtobufEncoder :
@@ -724,6 +721,9 @@ final List<HttpMessageWriter<?>> getBaseObjectWriters() {
724721
if (jackson2Present) {
725722
addCodec(writers, new EncoderHttpMessageWriter<>(getJackson2JsonEncoder()));
726723
}
724+
else if (kotlinSerializationJsonPresent) {
725+
addCodec(writers, new EncoderHttpMessageWriter<>(getKotlinSerializationJsonEncoder()));
726+
}
727727
if (jackson2SmilePresent) {
728728
addCodec(writers, new EncoderHttpMessageWriter<>(this.jackson2SmileEncoder != null ?
729729
(Jackson2SmileEncoder) this.jackson2SmileEncoder : new Jackson2SmileEncoder()));

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

+6-11
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,6 @@
6060
import org.springframework.http.codec.json.Jackson2JsonEncoder;
6161
import org.springframework.http.codec.json.Jackson2SmileDecoder;
6262
import org.springframework.http.codec.json.Jackson2SmileEncoder;
63-
import org.springframework.http.codec.json.KotlinSerializationJsonDecoder;
64-
import org.springframework.http.codec.json.KotlinSerializationJsonEncoder;
6563
import org.springframework.http.codec.multipart.DefaultPartHttpMessageReader;
6664
import org.springframework.http.codec.multipart.MultipartHttpMessageReader;
6765
import org.springframework.http.codec.multipart.MultipartHttpMessageWriter;
@@ -94,7 +92,7 @@ class ClientCodecConfigurerTests {
9492
@Test
9593
void defaultReaders() {
9694
List<HttpMessageReader<?>> readers = this.configurer.getReaders();
97-
assertThat(readers).hasSize(19);
95+
assertThat(readers).hasSize(18);
9896
assertThat(getNextDecoder(readers).getClass()).isEqualTo(ByteArrayDecoder.class);
9997
assertThat(getNextDecoder(readers).getClass()).isEqualTo(ByteBufferDecoder.class);
10098
assertThat(getNextDecoder(readers).getClass()).isEqualTo(DataBufferDecoder.class);
@@ -108,7 +106,6 @@ void defaultReaders() {
108106
assertThat(readers.get(this.index.getAndIncrement()).getClass()).isEqualTo(MultipartHttpMessageReader.class);
109107
assertThat(readers.get(this.index.getAndIncrement()).getClass()).isEqualTo(PartEventHttpMessageReader.class);
110108
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationCborDecoder.class);
111-
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationJsonDecoder.class);
112109
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationProtobufDecoder.class);
113110
assertThat(getNextDecoder(readers).getClass()).isEqualTo(Jackson2JsonDecoder.class);
114111
assertThat(getNextDecoder(readers).getClass()).isEqualTo(Jackson2SmileDecoder.class);
@@ -120,7 +117,7 @@ void defaultReaders() {
120117
@Test
121118
void defaultWriters() {
122119
List<HttpMessageWriter<?>> writers = this.configurer.getWriters();
123-
assertThat(writers).hasSize(17);
120+
assertThat(writers).hasSize(16);
124121
assertThat(getNextEncoder(writers).getClass()).isEqualTo(ByteArrayEncoder.class);
125122
assertThat(getNextEncoder(writers).getClass()).isEqualTo(ByteBufferEncoder.class);
126123
assertThat(getNextEncoder(writers).getClass()).isEqualTo(DataBufferEncoder.class);
@@ -132,7 +129,6 @@ void defaultWriters() {
132129
assertThat(writers.get(this.index.getAndIncrement()).getClass()).isEqualTo(PartEventHttpMessageWriter.class);
133130
assertThat(writers.get(this.index.getAndIncrement()).getClass()).isEqualTo(PartHttpMessageWriter.class);
134131
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationCborEncoder.class);
135-
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationJsonEncoder.class);
136132
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationProtobufEncoder.class);
137133
assertThat(getNextEncoder(writers).getClass()).isEqualTo(Jackson2JsonEncoder.class);
138134
assertThat(getNextEncoder(writers).getClass()).isEqualTo(Jackson2SmileEncoder.class);
@@ -188,7 +184,7 @@ void maxInMemorySize() {
188184
int size = 99;
189185
this.configurer.defaultCodecs().maxInMemorySize(size);
190186
List<HttpMessageReader<?>> readers = this.configurer.getReaders();
191-
assertThat(readers).hasSize(19);
187+
assertThat(readers).hasSize(18);
192188
assertThat(((ByteArrayDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
193189
assertThat(((ByteBufferDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
194190
assertThat(((DataBufferDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
@@ -201,7 +197,6 @@ void maxInMemorySize() {
201197
nextReader(readers);
202198
assertThat(((PartEventHttpMessageReader) nextReader(readers)).getMaxInMemorySize()).isEqualTo(size);
203199
assertThat(((KotlinSerializationCborDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
204-
assertThat(((KotlinSerializationJsonDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
205200
assertThat(((KotlinSerializationProtobufDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
206201
assertThat(((Jackson2JsonDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
207202
assertThat(((Jackson2SmileDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
@@ -250,7 +245,7 @@ void clonedConfigurer() {
250245
writers = findCodec(this.configurer.getWriters(), MultipartHttpMessageWriter.class).getPartWriters();
251246

252247
assertThat(sseDecoder).isNotSameAs(jackson2Decoder);
253-
assertThat(writers).hasSize(17);
248+
assertThat(writers).hasSize(16);
254249
}
255250

256251
@Test // gh-24194
@@ -260,7 +255,7 @@ public void cloneShouldNotDropMultipartCodecs() {
260255
List<HttpMessageWriter<?>> writers =
261256
findCodec(clone.getWriters(), MultipartHttpMessageWriter.class).getPartWriters();
262257

263-
assertThat(writers).hasSize(17);
258+
assertThat(writers).hasSize(16);
264259
}
265260

266261
@Test
@@ -274,7 +269,7 @@ void cloneShouldNotBeImpactedByChangesToOriginal() {
274269
List<HttpMessageWriter<?>> writers =
275270
findCodec(clone.getWriters(), MultipartHttpMessageWriter.class).getPartWriters();
276271

277-
assertThat(writers).hasSize(17);
272+
assertThat(writers).hasSize(16);
278273
}
279274

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

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

+4-10
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@
5353
import org.springframework.http.codec.json.Jackson2JsonEncoder;
5454
import org.springframework.http.codec.json.Jackson2SmileDecoder;
5555
import org.springframework.http.codec.json.Jackson2SmileEncoder;
56-
import org.springframework.http.codec.json.KotlinSerializationJsonDecoder;
57-
import org.springframework.http.codec.json.KotlinSerializationJsonEncoder;
5856
import org.springframework.http.codec.multipart.DefaultPartHttpMessageReader;
5957
import org.springframework.http.codec.multipart.MultipartHttpMessageReader;
6058
import org.springframework.http.codec.multipart.MultipartHttpMessageWriter;
@@ -90,7 +88,7 @@ class CodecConfigurerTests {
9088
@Test
9189
void defaultReaders() {
9290
List<HttpMessageReader<?>> readers = this.configurer.getReaders();
93-
assertThat(readers).hasSize(18);
91+
assertThat(readers).hasSize(17);
9492
assertThat(getNextDecoder(readers).getClass()).isEqualTo(ByteArrayDecoder.class);
9593
assertThat(getNextDecoder(readers).getClass()).isEqualTo(ByteBufferDecoder.class);
9694
assertThat(getNextDecoder(readers).getClass()).isEqualTo(DataBufferDecoder.class);
@@ -103,7 +101,6 @@ void defaultReaders() {
103101
assertThat(readers.get(this.index.getAndIncrement()).getClass()).isEqualTo(MultipartHttpMessageReader.class);
104102
assertThat(readers.get(this.index.getAndIncrement()).getClass()).isEqualTo(PartEventHttpMessageReader.class);
105103
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationCborDecoder.class);
106-
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationJsonDecoder.class);
107104
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationProtobufDecoder.class);
108105
assertThat(getNextDecoder(readers).getClass()).isEqualTo(Jackson2JsonDecoder.class);
109106
assertThat(getNextDecoder(readers).getClass()).isEqualTo(Jackson2SmileDecoder.class);
@@ -114,7 +111,7 @@ void defaultReaders() {
114111
@Test
115112
void defaultWriters() {
116113
List<HttpMessageWriter<?>> writers = this.configurer.getWriters();
117-
assertThat(writers).hasSize(17);
114+
assertThat(writers).hasSize(16);
118115
assertThat(getNextEncoder(writers).getClass()).isEqualTo(ByteArrayEncoder.class);
119116
assertThat(getNextEncoder(writers).getClass()).isEqualTo(ByteBufferEncoder.class);
120117
assertThat(getNextEncoder(writers).getClass()).isEqualTo(DataBufferEncoder.class);
@@ -126,7 +123,6 @@ void defaultWriters() {
126123
assertThat(writers.get(index.getAndIncrement()).getClass()).isEqualTo(PartEventHttpMessageWriter.class);
127124
assertThat(writers.get(index.getAndIncrement()).getClass()).isEqualTo(PartHttpMessageWriter.class);
128125
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationCborEncoder.class);
129-
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationJsonEncoder.class);
130126
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationProtobufEncoder.class);
131127
assertThat(getNextEncoder(writers).getClass()).isEqualTo(Jackson2JsonEncoder.class);
132128
assertThat(getNextEncoder(writers).getClass()).isEqualTo(Jackson2SmileEncoder.class);
@@ -156,7 +152,7 @@ void defaultAndCustomReaders() {
156152

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

159-
assertThat(readers).hasSize(22);
155+
assertThat(readers).hasSize(21);
160156
assertThat(getNextDecoder(readers)).isSameAs(customDecoder1);
161157
assertThat(readers.get(this.index.getAndIncrement())).isSameAs(customReader1);
162158
assertThat(getNextDecoder(readers).getClass()).isEqualTo(ByteArrayDecoder.class);
@@ -173,7 +169,6 @@ void defaultAndCustomReaders() {
173169
assertThat(getNextDecoder(readers)).isSameAs(customDecoder2);
174170
assertThat(readers.get(this.index.getAndIncrement())).isSameAs(customReader2);
175171
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationCborDecoder.class);
176-
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationJsonDecoder.class);
177172
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationProtobufDecoder.class);
178173
assertThat(getNextDecoder(readers).getClass()).isEqualTo(Jackson2JsonDecoder.class);
179174
assertThat(getNextDecoder(readers).getClass()).isEqualTo(Jackson2SmileDecoder.class);
@@ -203,7 +198,7 @@ void defaultAndCustomWriters() {
203198

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

206-
assertThat(writers).hasSize(21);
201+
assertThat(writers).hasSize(20);
207202
assertThat(getNextEncoder(writers)).isSameAs(customEncoder1);
208203
assertThat(writers.get(this.index.getAndIncrement())).isSameAs(customWriter1);
209204
assertThat(getNextEncoder(writers).getClass()).isEqualTo(ByteArrayEncoder.class);
@@ -219,7 +214,6 @@ void defaultAndCustomWriters() {
219214
assertThat(getNextEncoder(writers)).isSameAs(customEncoder2);
220215
assertThat(writers.get(this.index.getAndIncrement())).isSameAs(customWriter2);
221216
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationCborEncoder.class);
222-
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationJsonEncoder.class);
223217
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationProtobufEncoder.class);
224218
assertThat(getNextEncoder(writers).getClass()).isEqualTo(Jackson2JsonEncoder.class);
225219
assertThat(getNextEncoder(writers).getClass()).isEqualTo(Jackson2SmileEncoder.class);

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

+2-7
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,6 @@
5858
import org.springframework.http.codec.json.Jackson2JsonEncoder;
5959
import org.springframework.http.codec.json.Jackson2SmileDecoder;
6060
import org.springframework.http.codec.json.Jackson2SmileEncoder;
61-
import org.springframework.http.codec.json.KotlinSerializationJsonDecoder;
62-
import org.springframework.http.codec.json.KotlinSerializationJsonEncoder;
6361
import org.springframework.http.codec.multipart.DefaultPartHttpMessageReader;
6462
import org.springframework.http.codec.multipart.MultipartHttpMessageReader;
6563
import org.springframework.http.codec.multipart.MultipartHttpMessageWriter;
@@ -92,7 +90,7 @@ class ServerCodecConfigurerTests {
9290
@Test
9391
void defaultReaders() {
9492
List<HttpMessageReader<?>> readers = this.configurer.getReaders();
95-
assertThat(readers).hasSize(18);
93+
assertThat(readers).hasSize(17);
9694
assertThat(getNextDecoder(readers).getClass()).isEqualTo(ByteArrayDecoder.class);
9795
assertThat(getNextDecoder(readers).getClass()).isEqualTo(ByteBufferDecoder.class);
9896
assertThat(getNextDecoder(readers).getClass()).isEqualTo(DataBufferDecoder.class);
@@ -105,7 +103,6 @@ void defaultReaders() {
105103
assertThat(readers.get(this.index.getAndIncrement()).getClass()).isEqualTo(MultipartHttpMessageReader.class);
106104
assertThat(readers.get(this.index.getAndIncrement()).getClass()).isEqualTo(PartEventHttpMessageReader.class);
107105
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationCborDecoder.class);
108-
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationJsonDecoder.class);
109106
assertThat(getNextDecoder(readers).getClass()).isEqualTo(KotlinSerializationProtobufDecoder.class);
110107
assertThat(getNextDecoder(readers).getClass()).isEqualTo(Jackson2JsonDecoder.class);
111108
assertThat(getNextDecoder(readers).getClass()).isEqualTo(Jackson2SmileDecoder.class);
@@ -116,7 +113,7 @@ void defaultReaders() {
116113
@Test
117114
void defaultWriters() {
118115
List<HttpMessageWriter<?>> writers = this.configurer.getWriters();
119-
assertThat(writers).hasSize(18);
116+
assertThat(writers).hasSize(17);
120117
assertThat(getNextEncoder(writers).getClass()).isEqualTo(ByteArrayEncoder.class);
121118
assertThat(getNextEncoder(writers).getClass()).isEqualTo(ByteBufferEncoder.class);
122119
assertThat(getNextEncoder(writers).getClass()).isEqualTo(DataBufferEncoder.class);
@@ -128,7 +125,6 @@ void defaultWriters() {
128125
assertThat(writers.get(this.index.getAndIncrement()).getClass()).isEqualTo(PartEventHttpMessageWriter.class);
129126
assertThat(writers.get(this.index.getAndIncrement()).getClass()).isEqualTo(PartHttpMessageWriter.class);
130127
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationCborEncoder.class);
131-
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationJsonEncoder.class);
132128
assertThat(getNextEncoder(writers).getClass()).isEqualTo(KotlinSerializationProtobufEncoder.class);
133129
assertThat(getNextEncoder(writers).getClass()).isEqualTo(Jackson2JsonEncoder.class);
134130
assertThat(getNextEncoder(writers).getClass()).isEqualTo(Jackson2SmileEncoder.class);
@@ -176,7 +172,6 @@ void maxInMemorySize() {
176172
assertThat(((PartEventHttpMessageReader) nextReader(readers)).getMaxInMemorySize()).isEqualTo(size);
177173

178174
assertThat(((KotlinSerializationCborDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
179-
assertThat(((KotlinSerializationJsonDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
180175
assertThat(((KotlinSerializationProtobufDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
181176
assertThat(((Jackson2JsonDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);
182177
assertThat(((Jackson2SmileDecoder) getNextDecoder(readers)).getMaxInMemorySize()).isEqualTo(size);

spring-webflux/src/test/java/org/springframework/web/reactive/config/DelegatingWebFluxConfigurationTests.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ void requestMappingHandlerAdapter() {
116116
boolean condition = initializer.getValidator() instanceof LocalValidatorFactoryBean;
117117
assertThat(condition).isTrue();
118118
assertThat(initializer.getConversionService()).isSameAs(formatterRegistry.getValue());
119-
assertThat(codecsConfigurer.getValue().getReaders()).hasSize(16);
119+
assertThat(codecsConfigurer.getValue().getReaders()).hasSize(15);
120120
}
121121

122122
@Test

spring-webflux/src/test/java/org/springframework/web/reactive/config/WebFluxConfigurationSupportTests.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ void requestMappingHandlerAdapter() {
114114
assertThat(adapter).isNotNull();
115115

116116
List<HttpMessageReader<?>> readers = adapter.getMessageReaders();
117-
assertThat(readers).hasSize(16);
117+
assertThat(readers).hasSize(15);
118118

119119
ResolvableType multiValueMapType = forClassWithGenerics(MultiValueMap.class, String.class, String.class);
120120

@@ -169,7 +169,7 @@ void responseEntityResultHandler() {
169169
assertThat(handler.getOrder()).isEqualTo(0);
170170

171171
List<HttpMessageWriter<?>> writers = handler.getMessageWriters();
172-
assertThat(writers).hasSize(16);
172+
assertThat(writers).hasSize(15);
173173

174174
assertHasMessageWriter(writers, forClass(byte[].class), APPLICATION_OCTET_STREAM);
175175
assertHasMessageWriter(writers, forClass(ByteBuffer.class), APPLICATION_OCTET_STREAM);
@@ -197,7 +197,7 @@ void responseBodyResultHandler() {
197197
assertThat(handler.getOrder()).isEqualTo(100);
198198

199199
List<HttpMessageWriter<?>> writers = handler.getMessageWriters();
200-
assertThat(writers).hasSize(16);
200+
assertThat(writers).hasSize(15);
201201

202202
assertHasMessageWriter(writers, forClass(byte[].class), APPLICATION_OCTET_STREAM);
203203
assertHasMessageWriter(writers, forClass(ByteBuffer.class), APPLICATION_OCTET_STREAM);

spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -894,9 +894,6 @@ else if (jaxb2Present) {
894894
if (kotlinSerializationCborPresent) {
895895
messageConverters.add(new KotlinSerializationCborHttpMessageConverter());
896896
}
897-
if (kotlinSerializationJsonPresent) {
898-
messageConverters.add(new KotlinSerializationJsonHttpMessageConverter());
899-
}
900897
if (kotlinSerializationProtobufPresent) {
901898
messageConverters.add(new KotlinSerializationProtobufHttpMessageConverter());
902899
}
@@ -914,6 +911,9 @@ else if (gsonPresent) {
914911
else if (jsonbPresent) {
915912
messageConverters.add(new JsonbHttpMessageConverter());
916913
}
914+
else if (kotlinSerializationJsonPresent) {
915+
messageConverters.add(new KotlinSerializationJsonHttpMessageConverter());
916+
}
917917

918918
if (jackson2SmilePresent) {
919919
Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.smile();

0 commit comments

Comments
 (0)