提交 a42540e6 编写于 作者: R Rossen Stoyanchev

Multipart writer detects custom Jackson encoder

Closes gh-27017
上级 cc2b980e
...@@ -221,6 +221,7 @@ class BaseDefaultCodecs implements CodecConfigurer.DefaultCodecs, CodecConfigure ...@@ -221,6 +221,7 @@ class BaseDefaultCodecs implements CodecConfigurer.DefaultCodecs, CodecConfigure
public void jackson2JsonEncoder(Encoder<?> encoder) { public void jackson2JsonEncoder(Encoder<?> encoder) {
this.jackson2JsonEncoder = encoder; this.jackson2JsonEncoder = encoder;
initObjectWriters(); initObjectWriters();
initTypedWriters();
} }
@Override @Override
...@@ -233,6 +234,7 @@ class BaseDefaultCodecs implements CodecConfigurer.DefaultCodecs, CodecConfigure ...@@ -233,6 +234,7 @@ class BaseDefaultCodecs implements CodecConfigurer.DefaultCodecs, CodecConfigure
public void jackson2SmileEncoder(Encoder<?> encoder) { public void jackson2SmileEncoder(Encoder<?> encoder) {
this.jackson2SmileEncoder = encoder; this.jackson2SmileEncoder = encoder;
initObjectWriters(); initObjectWriters();
initTypedWriters();
} }
@Override @Override
......
...@@ -123,12 +123,28 @@ public class ClientCodecConfigurerTests { ...@@ -123,12 +123,28 @@ public class ClientCodecConfigurerTests {
} }
@Test @Test
public void jackson2CodecCustomizations() { public void jackson2CodecCustomization() {
Jackson2JsonDecoder decoder = new Jackson2JsonDecoder(); Jackson2JsonDecoder decoder = new Jackson2JsonDecoder();
Jackson2JsonEncoder encoder = new Jackson2JsonEncoder(); Jackson2JsonEncoder encoder = new Jackson2JsonEncoder();
this.configurer.defaultCodecs().jackson2JsonDecoder(decoder); this.configurer.defaultCodecs().jackson2JsonDecoder(decoder);
this.configurer.defaultCodecs().jackson2JsonEncoder(encoder); this.configurer.defaultCodecs().jackson2JsonEncoder(encoder);
List<HttpMessageReader<?>> readers = this.configurer.getReaders();
Jackson2JsonDecoder actualDecoder = findCodec(readers, Jackson2JsonDecoder.class);
assertThat(actualDecoder).isSameAs(decoder);
assertThat(findCodec(readers, ServerSentEventHttpMessageReader.class).getDecoder()).isSameAs(decoder);
List<HttpMessageWriter<?>> writers = this.configurer.getWriters();
Jackson2JsonEncoder actualEncoder = findCodec(writers, Jackson2JsonEncoder.class);
assertThat(actualEncoder).isSameAs(encoder);
MultipartHttpMessageWriter multipartWriter = findCodec(writers, MultipartHttpMessageWriter.class);
actualEncoder = findCodec(multipartWriter.getPartWriters(), Jackson2JsonEncoder.class);
assertThat(actualEncoder).isSameAs(encoder);
}
@Test
public void objectMapperCustomization() {
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
this.configurer.defaultCodecs().configureDefaultCodec(codec -> { this.configurer.defaultCodecs().configureDefaultCodec(codec -> {
if (codec instanceof Jackson2CodecSupport) { if (codec instanceof Jackson2CodecSupport) {
...@@ -138,13 +154,14 @@ public class ClientCodecConfigurerTests { ...@@ -138,13 +154,14 @@ public class ClientCodecConfigurerTests {
List<HttpMessageReader<?>> readers = this.configurer.getReaders(); List<HttpMessageReader<?>> readers = this.configurer.getReaders();
Jackson2JsonDecoder actualDecoder = findCodec(readers, Jackson2JsonDecoder.class); Jackson2JsonDecoder actualDecoder = findCodec(readers, Jackson2JsonDecoder.class);
assertThat(actualDecoder).isSameAs(decoder);
assertThat(actualDecoder.getObjectMapper()).isSameAs(objectMapper); assertThat(actualDecoder.getObjectMapper()).isSameAs(objectMapper);
assertThat(findCodec(readers, ServerSentEventHttpMessageReader.class).getDecoder()).isSameAs(decoder);
List<HttpMessageWriter<?>> writers = this.configurer.getWriters(); List<HttpMessageWriter<?>> writers = this.configurer.getWriters();
Jackson2JsonEncoder actualEncoder = findCodec(writers, Jackson2JsonEncoder.class); Jackson2JsonEncoder actualEncoder = findCodec(writers, Jackson2JsonEncoder.class);
assertThat(actualEncoder).isSameAs(encoder); assertThat(actualEncoder.getObjectMapper()).isSameAs(objectMapper);
MultipartHttpMessageWriter multipartWriter = findCodec(writers, MultipartHttpMessageWriter.class);
actualEncoder = findCodec(multipartWriter.getPartWriters(), Jackson2JsonEncoder.class);
assertThat(actualEncoder.getObjectMapper()).isSameAs(objectMapper); assertThat(actualEncoder.getObjectMapper()).isSameAs(objectMapper);
} }
......
/* /*
* Copyright 2002-2020 the original author or authors. * Copyright 2002-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -125,15 +125,19 @@ public class ServerCodecConfigurerTests { ...@@ -125,15 +125,19 @@ public class ServerCodecConfigurerTests {
@Test @Test
public void jackson2EncoderOverride() { public void jackson2EncoderOverride() {
Jackson2JsonDecoder decoder = new Jackson2JsonDecoder();
Jackson2JsonEncoder encoder = new Jackson2JsonEncoder(); Jackson2JsonEncoder encoder = new Jackson2JsonEncoder();
this.configurer.defaultCodecs().jackson2JsonDecoder(decoder);
this.configurer.defaultCodecs().jackson2JsonEncoder(encoder); this.configurer.defaultCodecs().jackson2JsonEncoder(encoder);
assertThat(this.configurer.getWriters().stream() List<HttpMessageReader<?>> readers = this.configurer.getReaders();
.filter(writer -> ServerSentEventHttpMessageWriter.class.equals(writer.getClass())) Jackson2JsonDecoder actualDecoder = findCodec(readers, Jackson2JsonDecoder.class);
.map(writer -> (ServerSentEventHttpMessageWriter) writer) assertThat(actualDecoder).isSameAs(decoder);
.findFirst()
.map(ServerSentEventHttpMessageWriter::getEncoder) List<HttpMessageWriter<?>> writers = this.configurer.getWriters();
.filter(e -> e == encoder).orElse(null)).isSameAs(encoder); Jackson2JsonEncoder actualEncoder = findCodec(writers, Jackson2JsonEncoder.class);
assertThat(actualEncoder).isSameAs(encoder);
assertThat(findCodec(writers, ServerSentEventHttpMessageWriter.class).getEncoder()).isSameAs(encoder);
} }
@Test @Test
...@@ -261,7 +265,19 @@ public class ServerCodecConfigurerTests { ...@@ -261,7 +265,19 @@ public class ServerCodecConfigurerTests {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private <T> T findCodec(List<?> codecs, Class<T> type) { private <T> T findCodec(List<?> codecs, Class<T> type) {
return (T) codecs.stream().filter(type::isInstance).findFirst().get(); return (T) codecs.stream()
.map(c -> {
if (c instanceof EncoderHttpMessageWriter) {
return ((EncoderHttpMessageWriter<?>) c).getEncoder();
}
else if (c instanceof DecoderHttpMessageReader) {
return ((DecoderHttpMessageReader<?>) c).getDecoder();
}
else {
return c;
}
})
.filter(type::isInstance).findFirst().get();
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册