Skip to content

Commit a42540e

Browse files
committed
Multipart writer detects custom Jackson encoder
Closes gh-27017
1 parent cc2b980 commit a42540e

File tree

3 files changed

+47
-12
lines changed

3 files changed

+47
-12
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ public void jackson2JsonDecoder(Decoder<?> decoder) {
221221
public void jackson2JsonEncoder(Encoder<?> encoder) {
222222
this.jackson2JsonEncoder = encoder;
223223
initObjectWriters();
224+
initTypedWriters();
224225
}
225226

226227
@Override
@@ -233,6 +234,7 @@ public void jackson2SmileDecoder(Decoder<?> decoder) {
233234
public void jackson2SmileEncoder(Encoder<?> encoder) {
234235
this.jackson2SmileEncoder = encoder;
235236
initObjectWriters();
237+
initTypedWriters();
236238
}
237239

238240
@Override

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

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,12 +123,28 @@ public void defaultWriters() {
123123
}
124124

125125
@Test
126-
public void jackson2CodecCustomizations() {
126+
public void jackson2CodecCustomization() {
127127
Jackson2JsonDecoder decoder = new Jackson2JsonDecoder();
128128
Jackson2JsonEncoder encoder = new Jackson2JsonEncoder();
129129
this.configurer.defaultCodecs().jackson2JsonDecoder(decoder);
130130
this.configurer.defaultCodecs().jackson2JsonEncoder(encoder);
131131

132+
List<HttpMessageReader<?>> readers = this.configurer.getReaders();
133+
Jackson2JsonDecoder actualDecoder = findCodec(readers, Jackson2JsonDecoder.class);
134+
assertThat(actualDecoder).isSameAs(decoder);
135+
assertThat(findCodec(readers, ServerSentEventHttpMessageReader.class).getDecoder()).isSameAs(decoder);
136+
137+
List<HttpMessageWriter<?>> writers = this.configurer.getWriters();
138+
Jackson2JsonEncoder actualEncoder = findCodec(writers, Jackson2JsonEncoder.class);
139+
assertThat(actualEncoder).isSameAs(encoder);
140+
141+
MultipartHttpMessageWriter multipartWriter = findCodec(writers, MultipartHttpMessageWriter.class);
142+
actualEncoder = findCodec(multipartWriter.getPartWriters(), Jackson2JsonEncoder.class);
143+
assertThat(actualEncoder).isSameAs(encoder);
144+
}
145+
146+
@Test
147+
public void objectMapperCustomization() {
132148
ObjectMapper objectMapper = new ObjectMapper();
133149
this.configurer.defaultCodecs().configureDefaultCodec(codec -> {
134150
if (codec instanceof Jackson2CodecSupport) {
@@ -138,13 +154,14 @@ public void jackson2CodecCustomizations() {
138154

139155
List<HttpMessageReader<?>> readers = this.configurer.getReaders();
140156
Jackson2JsonDecoder actualDecoder = findCodec(readers, Jackson2JsonDecoder.class);
141-
assertThat(actualDecoder).isSameAs(decoder);
142157
assertThat(actualDecoder.getObjectMapper()).isSameAs(objectMapper);
143-
assertThat(findCodec(readers, ServerSentEventHttpMessageReader.class).getDecoder()).isSameAs(decoder);
144158

145159
List<HttpMessageWriter<?>> writers = this.configurer.getWriters();
146160
Jackson2JsonEncoder actualEncoder = findCodec(writers, Jackson2JsonEncoder.class);
147-
assertThat(actualEncoder).isSameAs(encoder);
161+
assertThat(actualEncoder.getObjectMapper()).isSameAs(objectMapper);
162+
163+
MultipartHttpMessageWriter multipartWriter = findCodec(writers, MultipartHttpMessageWriter.class);
164+
actualEncoder = findCodec(multipartWriter.getPartWriters(), Jackson2JsonEncoder.class);
148165
assertThat(actualEncoder.getObjectMapper()).isSameAs(objectMapper);
149166
}
150167

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

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2020 the original author or authors.
2+
* Copyright 2002-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -125,15 +125,19 @@ public void defaultWriters() {
125125

126126
@Test
127127
public void jackson2EncoderOverride() {
128+
Jackson2JsonDecoder decoder = new Jackson2JsonDecoder();
128129
Jackson2JsonEncoder encoder = new Jackson2JsonEncoder();
130+
this.configurer.defaultCodecs().jackson2JsonDecoder(decoder);
129131
this.configurer.defaultCodecs().jackson2JsonEncoder(encoder);
130132

131-
assertThat(this.configurer.getWriters().stream()
132-
.filter(writer -> ServerSentEventHttpMessageWriter.class.equals(writer.getClass()))
133-
.map(writer -> (ServerSentEventHttpMessageWriter) writer)
134-
.findFirst()
135-
.map(ServerSentEventHttpMessageWriter::getEncoder)
136-
.filter(e -> e == encoder).orElse(null)).isSameAs(encoder);
133+
List<HttpMessageReader<?>> readers = this.configurer.getReaders();
134+
Jackson2JsonDecoder actualDecoder = findCodec(readers, Jackson2JsonDecoder.class);
135+
assertThat(actualDecoder).isSameAs(decoder);
136+
137+
List<HttpMessageWriter<?>> writers = this.configurer.getWriters();
138+
Jackson2JsonEncoder actualEncoder = findCodec(writers, Jackson2JsonEncoder.class);
139+
assertThat(actualEncoder).isSameAs(encoder);
140+
assertThat(findCodec(writers, ServerSentEventHttpMessageWriter.class).getEncoder()).isSameAs(encoder);
137141
}
138142

139143
@Test
@@ -261,7 +265,19 @@ private Encoder<?> getNextEncoder(List<HttpMessageWriter<?>> writers) {
261265

262266
@SuppressWarnings("unchecked")
263267
private <T> T findCodec(List<?> codecs, Class<T> type) {
264-
return (T) codecs.stream().filter(type::isInstance).findFirst().get();
268+
return (T) codecs.stream()
269+
.map(c -> {
270+
if (c instanceof EncoderHttpMessageWriter) {
271+
return ((EncoderHttpMessageWriter<?>) c).getEncoder();
272+
}
273+
else if (c instanceof DecoderHttpMessageReader) {
274+
return ((DecoderHttpMessageReader<?>) c).getDecoder();
275+
}
276+
else {
277+
return c;
278+
}
279+
})
280+
.filter(type::isInstance).findFirst().get();
265281
}
266282

267283
@SuppressWarnings("unchecked")

0 commit comments

Comments
 (0)