Skip to content

Commit f397577

Browse files
committed
Use list of HttpMessage[Reader|Writer]s instead of CodecConfigurer
This commit changes all consumers of CodecConfigurer to consume a `List` of HttpMessageReaders or HttpMessageWriters instead of consuming the Server- or ClientCodecConfigurer directly. Issue: SPR-15816
1 parent 1e07468 commit f397577

File tree

8 files changed

+59
-63
lines changed

8 files changed

+59
-63
lines changed

spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurationSupport.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ public void configurePathMatching(PathMatchConfigurer configurer) {
192192
public RouterFunctionMapping routerFunctionMapping() {
193193
RouterFunctionMapping mapping = createRouterFunctionMapping();
194194
mapping.setOrder(-1); // go before RequestMappingHandlerMapping
195-
mapping.setMessageCodecConfigurer(serverCodecConfigurer());
195+
mapping.setMessageReaders(serverCodecConfigurer().getReaders());
196196
mapping.setCorsConfigurations(getCorsConfigurations());
197197

198198
return mapping;
@@ -247,7 +247,7 @@ protected void addResourceHandlers(ResourceHandlerRegistry registry) {
247247
@Bean
248248
public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
249249
RequestMappingHandlerAdapter adapter = createRequestMappingHandlerAdapter();
250-
adapter.setMessageCodecConfigurer(serverCodecConfigurer());
250+
adapter.setMessageReaders(serverCodecConfigurer().getReaders());
251251
adapter.setWebBindingInitializer(getConfigurableWebBindingInitializer());
252252
adapter.setReactiveAdapterRegistry(webFluxAdapterRegistry());
253253

@@ -425,7 +425,7 @@ public ServerResponseResultHandler serverResponseResultHandler() {
425425
List<ViewResolver> resolvers = registry.getViewResolvers();
426426

427427
ServerResponseResultHandler handler = new ServerResponseResultHandler();
428-
handler.setMessageCodecConfigurer(serverCodecConfigurer());
428+
handler.setMessageWriters(serverCodecConfigurer().getWriters());
429429
handler.setViewResolvers(resolvers);
430430
handler.setOrder(registry.getOrder() + 1);
431431

spring-webflux/src/main/java/org/springframework/web/reactive/function/server/support/RouterFunctionMapping.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import org.springframework.beans.factory.InitializingBean;
2525
import org.springframework.beans.factory.annotation.Autowired;
26+
import org.springframework.http.codec.HttpMessageReader;
2627
import org.springframework.http.codec.ServerCodecConfigurer;
2728
import org.springframework.lang.Nullable;
2829
import org.springframework.util.Assert;
@@ -48,8 +49,7 @@ public class RouterFunctionMapping extends AbstractHandlerMapping implements Ini
4849
@Nullable
4950
private RouterFunction<?> routerFunction;
5051

51-
@Nullable
52-
private ServerCodecConfigurer messageCodecConfigurer;
52+
private List<HttpMessageReader<?>> messageReaders = Collections.emptyList();
5353

5454

5555
/**
@@ -72,18 +72,20 @@ public RouterFunctionMapping(RouterFunction<?> routerFunction) {
7272

7373
/**
7474
* Configure HTTP message readers to de-serialize the request body with.
75-
* <p>By default this is set to {@link ServerCodecConfigurer} with defaults.
75+
* <p>By default this is set to the {@link ServerCodecConfigurer}'s defaults.
7676
*/
77-
public void setMessageCodecConfigurer(ServerCodecConfigurer configurer) {
78-
this.messageCodecConfigurer = configurer;
77+
public void setMessageReaders(List<HttpMessageReader<?>> messageReaders) {
78+
Assert.notNull(messageReaders, "'messageReaders' must not be null");
79+
this.messageReaders = messageReaders;
7980
}
8081

81-
8282
@Override
8383
public void afterPropertiesSet() throws Exception {
84-
if (this.messageCodecConfigurer == null) {
85-
this.messageCodecConfigurer = ServerCodecConfigurer.create();
84+
if (CollectionUtils.isEmpty(this.messageReaders)) {
85+
ServerCodecConfigurer codecConfigurer = ServerCodecConfigurer.create();
86+
this.messageReaders = codecConfigurer.getReaders();
8687
}
88+
8789
if (this.routerFunction == null) {
8890
initRouterFunctions();
8991
}
@@ -120,8 +122,7 @@ private List<RouterFunction<?>> routerFunctions() {
120122
@Override
121123
protected Mono<?> getHandlerInternal(ServerWebExchange exchange) {
122124
if (this.routerFunction != null) {
123-
Assert.state(this.messageCodecConfigurer != null, "No ServerCodecConfigurer set");
124-
ServerRequest request = ServerRequest.create(exchange, this.messageCodecConfigurer.getReaders());
125+
ServerRequest request = ServerRequest.create(exchange, this.messageReaders);
125126
exchange.getAttributes().put(RouterFunctions.REQUEST_ATTRIBUTE, request);
126127
return this.routerFunction.route(request);
127128
}

spring-webflux/src/main/java/org/springframework/web/reactive/function/server/support/ServerResponseResultHandler.java

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
import org.springframework.core.Ordered;
2626
import org.springframework.http.codec.HttpMessageWriter;
2727
import org.springframework.http.codec.ServerCodecConfigurer;
28-
import org.springframework.lang.Nullable;
2928
import org.springframework.util.Assert;
29+
import org.springframework.util.CollectionUtils;
3030
import org.springframework.web.reactive.HandlerResult;
3131
import org.springframework.web.reactive.HandlerResultHandler;
3232
import org.springframework.web.reactive.function.server.ServerResponse;
@@ -41,20 +41,20 @@
4141
*/
4242
public class ServerResponseResultHandler implements HandlerResultHandler, InitializingBean, Ordered {
4343

44-
@Nullable
45-
private ServerCodecConfigurer messageCodecConfigurer;
44+
private List<HttpMessageWriter<?>> messageWriters = Collections.emptyList();
4645

4746
private List<ViewResolver> viewResolvers = Collections.emptyList();
4847

4948
private int order = LOWEST_PRECEDENCE;
5049

5150

5251
/**
53-
* Configure HTTP message readers to de-serialize the request body with.
54-
* <p>By default this is set to {@link ServerCodecConfigurer} with defaults.
52+
* Configure HTTP message writers to serialize the request body with.
53+
* <p>By default this is set to {@link ServerCodecConfigurer}'s default writers.
5554
*/
56-
public void setMessageCodecConfigurer(ServerCodecConfigurer configurer) {
57-
this.messageCodecConfigurer = configurer;
55+
public void setMessageWriters(List<HttpMessageWriter<?>> configurer) {
56+
Assert.notNull(messageWriters, "'messageWriters' must not be null");
57+
this.messageWriters = configurer;
5858
}
5959

6060
public void setViewResolvers(List<ViewResolver> viewResolvers) {
@@ -79,8 +79,8 @@ public int getOrder() {
7979

8080
@Override
8181
public void afterPropertiesSet() throws Exception {
82-
if (this.messageCodecConfigurer == null) {
83-
throw new IllegalArgumentException("Property 'messageCodecConfigurer' is required");
82+
if (CollectionUtils.isEmpty(this.messageWriters)) {
83+
throw new IllegalArgumentException("Property 'messageWriters' is required");
8484
}
8585
}
8686

@@ -96,8 +96,7 @@ public Mono<Void> handleResult(ServerWebExchange exchange, HandlerResult result)
9696
return response.writeTo(exchange, new ServerResponse.Context() {
9797
@Override
9898
public List<HttpMessageWriter<?>> messageWriters() {
99-
return (messageCodecConfigurer != null ?
100-
messageCodecConfigurer.getWriters() : Collections.emptyList());
99+
return messageWriters;
101100
}
102101
@Override
103102
public List<ViewResolver> viewResolvers() {

spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ControllerMethodResolver.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.lang.reflect.Method;
2020
import java.util.ArrayList;
21+
import java.util.Collections;
2122
import java.util.LinkedHashMap;
2223
import java.util.List;
2324
import java.util.Map;
@@ -37,9 +38,9 @@
3738
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
3839
import org.springframework.core.annotation.AnnotationUtils;
3940
import org.springframework.http.codec.HttpMessageReader;
40-
import org.springframework.http.codec.ServerCodecConfigurer;
4141
import org.springframework.lang.Nullable;
4242
import org.springframework.util.Assert;
43+
import org.springframework.util.CollectionUtils;
4344
import org.springframework.util.ReflectionUtils;
4445
import org.springframework.web.bind.annotation.InitBinder;
4546
import org.springframework.web.bind.annotation.ModelAttribute;
@@ -52,7 +53,7 @@
5253
import org.springframework.web.reactive.result.method.SyncHandlerMethodArgumentResolver;
5354
import org.springframework.web.reactive.result.method.SyncInvocableHandlerMethod;
5455

55-
import static org.springframework.core.MethodIntrospector.*;
56+
import static org.springframework.core.MethodIntrospector.selectMethods;
5657

5758
/**
5859
* Package-private class to assist {@link RequestMappingHandlerAdapter} with
@@ -98,25 +99,25 @@ class ControllerMethodResolver {
9899

99100

100101
ControllerMethodResolver(ArgumentResolverConfigurer argumentResolvers,
101-
ServerCodecConfigurer messageCodecs, ReactiveAdapterRegistry reactiveRegistry,
102+
List<HttpMessageReader<?>> messageReaders, ReactiveAdapterRegistry reactiveRegistry,
102103
ConfigurableApplicationContext context) {
103104

104105
Assert.notNull(argumentResolvers, "ArgumentResolverConfigurer is required");
105-
Assert.notNull(messageCodecs, "ServerCodecConfigurer is required");
106+
Assert.notNull(messageReaders, "'messageReaders' is required");
106107
Assert.notNull(reactiveRegistry, "ReactiveAdapterRegistry is required");
107108
Assert.notNull(context, "ApplicationContext is required");
108109

109110
ArgumentResolverRegistrar registrar;
110111

111-
registrar= ArgumentResolverRegistrar.configurer(argumentResolvers).basic();
112+
registrar = ArgumentResolverRegistrar.configurer(argumentResolvers).basic();
112113
addResolversTo(registrar, reactiveRegistry, context);
113114
this.initBinderResolvers = registrar.getSyncResolvers();
114115

115116
registrar = ArgumentResolverRegistrar.configurer(argumentResolvers).modelAttributeSupport();
116117
addResolversTo(registrar, reactiveRegistry, context);
117118
this.modelAttributeResolvers = registrar.getResolvers();
118119

119-
registrar = ArgumentResolverRegistrar.configurer(argumentResolvers).fullSupport(messageCodecs);
120+
registrar = ArgumentResolverRegistrar.configurer(argumentResolvers).fullSupport(messageReaders);
120121
addResolversTo(registrar, reactiveRegistry, context);
121122
this.requestMappingResolvers = registrar.getResolvers();
122123

@@ -329,18 +330,17 @@ private static class ArgumentResolverRegistrar {
329330

330331
private final List<HandlerMethodArgumentResolver> customResolvers;
331332

332-
@Nullable
333333
private final List<HttpMessageReader<?>> messageReaders;
334334

335335
private final boolean modelAttributeSupported;
336336

337337
private final List<HandlerMethodArgumentResolver> result = new ArrayList<>();
338338

339339
private ArgumentResolverRegistrar(ArgumentResolverConfigurer resolvers,
340-
@Nullable ServerCodecConfigurer codecs, boolean modelAttribute) {
340+
List<HttpMessageReader<?>> messageReaders, boolean modelAttribute) {
341341

342342
this.customResolvers = resolvers.getCustomResolvers();
343-
this.messageReaders = (codecs != null ? codecs.getReaders() : null);
343+
this.messageReaders = messageReaders;
344344
this.modelAttributeSupported = modelAttribute;
345345
}
346346

@@ -350,7 +350,7 @@ public void add(HandlerMethodArgumentResolver resolver) {
350350
}
351351

352352
public void addIfRequestBody(Function<List<HttpMessageReader<?>>, HandlerMethodArgumentResolver> function) {
353-
if (this.messageReaders != null) {
353+
if (!CollectionUtils.isEmpty(this.messageReaders)) {
354354
add(function.apply(this.messageReaders));
355355
}
356356
}
@@ -390,16 +390,16 @@ public Builder(ArgumentResolverConfigurer configurer) {
390390
this.resolvers = configurer;
391391
}
392392

393-
public ArgumentResolverRegistrar fullSupport(ServerCodecConfigurer codecs) {
394-
return new ArgumentResolverRegistrar(this.resolvers, codecs, true);
393+
public ArgumentResolverRegistrar fullSupport(List<HttpMessageReader<?>> httpMessageReaders) {
394+
return new ArgumentResolverRegistrar(this.resolvers, httpMessageReaders, true);
395395
}
396396

397397
public ArgumentResolverRegistrar modelAttributeSupport() {
398-
return new ArgumentResolverRegistrar(this.resolvers, null, true);
398+
return new ArgumentResolverRegistrar(this.resolvers, Collections.emptyList(), true);
399399
}
400400

401401
public ArgumentResolverRegistrar basic() {
402-
return new ArgumentResolverRegistrar(this.resolvers, null, false);
402+
return new ArgumentResolverRegistrar(this.resolvers, Collections.emptyList(), false);
403403
}
404404
}
405405
}

spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerAdapter.java

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.web.reactive.result.method.annotation;
1818

19+
import java.util.Collections;
1920
import java.util.List;
2021
import java.util.function.Function;
2122

@@ -28,9 +29,11 @@
2829
import org.springframework.context.ApplicationContextAware;
2930
import org.springframework.context.ConfigurableApplicationContext;
3031
import org.springframework.core.ReactiveAdapterRegistry;
32+
import org.springframework.http.codec.HttpMessageReader;
3133
import org.springframework.http.codec.ServerCodecConfigurer;
3234
import org.springframework.lang.Nullable;
3335
import org.springframework.util.Assert;
36+
import org.springframework.util.CollectionUtils;
3437
import org.springframework.web.bind.support.WebBindingInitializer;
3538
import org.springframework.web.method.HandlerMethod;
3639
import org.springframework.web.reactive.BindingContext;
@@ -50,8 +53,7 @@ public class RequestMappingHandlerAdapter implements HandlerAdapter, Application
5053
private static final Log logger = LogFactory.getLog(RequestMappingHandlerAdapter.class);
5154

5255

53-
@Nullable
54-
private ServerCodecConfigurer messageCodecConfigurer;
56+
private List<HttpMessageReader<?>> messageReaders = Collections.emptyList();
5557

5658
@Nullable
5759
private WebBindingInitializer webBindingInitializer;
@@ -74,18 +76,18 @@ public class RequestMappingHandlerAdapter implements HandlerAdapter, Application
7476

7577
/**
7678
* Configure HTTP message readers to de-serialize the request body with.
77-
* <p>By default this is set to {@link ServerCodecConfigurer} with defaults.
79+
* <p>By default this is set to {@link ServerCodecConfigurer}'s readers with defaults.
7880
*/
79-
public void setMessageCodecConfigurer(@Nullable ServerCodecConfigurer configurer) {
80-
this.messageCodecConfigurer = configurer;
81+
public void setMessageReaders(List<HttpMessageReader<?>> messageReaders) {
82+
Assert.notNull(messageReaders, "'messageReaders' must not be null");
83+
this.messageReaders = messageReaders;
8184
}
8285

8386
/**
8487
* Return the configurer for HTTP message readers.
8588
*/
86-
@Nullable
87-
public ServerCodecConfigurer getMessageCodecConfigurer() {
88-
return this.messageCodecConfigurer;
89+
public List<HttpMessageReader<?>> getMessageReaders() {
90+
return this.messageReaders;
8991
}
9092

9193
/**
@@ -153,8 +155,9 @@ public void setApplicationContext(ApplicationContext applicationContext) {
153155
public void afterPropertiesSet() throws Exception {
154156
Assert.notNull(this.applicationContext, "ApplicationContext is required");
155157

156-
if (this.messageCodecConfigurer == null) {
157-
this.messageCodecConfigurer = ServerCodecConfigurer.create();
158+
if (CollectionUtils.isEmpty(this.messageReaders)) {
159+
ServerCodecConfigurer codecConfigurer = ServerCodecConfigurer.create();
160+
this.messageReaders = codecConfigurer.getReaders();
158161
}
159162
if (this.argumentResolverConfigurer == null) {
160163
this.argumentResolverConfigurer = new ArgumentResolverConfigurer();
@@ -164,7 +167,7 @@ public void afterPropertiesSet() throws Exception {
164167
}
165168

166169
this.methodResolver = new ControllerMethodResolver(this.argumentResolverConfigurer,
167-
this.messageCodecConfigurer, this.reactiveAdapterRegistry, this.applicationContext);
170+
this.messageReaders, this.reactiveAdapterRegistry, this.applicationContext);
168171

169172
this.modelInitializer = new ModelInitializer(this.reactiveAdapterRegistry);
170173
}

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

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import java.nio.ByteBuffer;
2121
import java.util.Collections;
2222
import java.util.List;
23-
2423
import javax.xml.bind.annotation.XmlRootElement;
2524

2625
import org.junit.Test;
@@ -66,11 +65,7 @@
6665
import org.springframework.web.server.WebHandler;
6766
import org.springframework.web.util.pattern.PathPatternParser;
6867

69-
import static org.junit.Assert.assertEquals;
70-
import static org.junit.Assert.assertFalse;
71-
import static org.junit.Assert.assertNotNull;
72-
import static org.junit.Assert.assertSame;
73-
import static org.junit.Assert.assertTrue;
68+
import static org.junit.Assert.*;
7469
import static org.springframework.core.ResolvableType.forClass;
7570
import static org.springframework.core.ResolvableType.forClassWithGenerics;
7671
import static org.springframework.http.MediaType.APPLICATION_FORM_URLENCODED;
@@ -137,7 +132,7 @@ public void requestMappingHandlerAdapter() throws Exception {
137132
RequestMappingHandlerAdapter adapter = context.getBean(name, RequestMappingHandlerAdapter.class);
138133
assertNotNull(adapter);
139134

140-
List<HttpMessageReader<?>> readers = adapter.getMessageCodecConfigurer().getReaders();
135+
List<HttpMessageReader<?>> readers = adapter.getMessageReaders();
141136
assertEquals(12, readers.size());
142137

143138
assertHasMessageReader(readers, forClass(byte[].class), APPLICATION_OCTET_STREAM);
@@ -172,7 +167,7 @@ public void customMessageConverterConfig() throws Exception {
172167
RequestMappingHandlerAdapter adapter = context.getBean(name, RequestMappingHandlerAdapter.class);
173168
assertNotNull(adapter);
174169

175-
List<HttpMessageReader<?>> messageReaders = adapter.getMessageCodecConfigurer().getReaders();
170+
List<HttpMessageReader<?>> messageReaders = adapter.getMessageReaders();
176171
assertEquals(2, messageReaders.size());
177172

178173
assertHasMessageReader(messageReaders, forClass(String.class), TEXT_PLAIN);

spring-webflux/src/test/java/org/springframework/web/reactive/function/server/support/RouterFunctionMappingTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public void normal() {
6666
RouterFunction<ServerResponse> routerFunction = request -> Mono.just(handlerFunction);
6767

6868
RouterFunctionMapping mapping = new RouterFunctionMapping(routerFunction);
69-
mapping.setMessageCodecConfigurer(this.codecConfigurer);
69+
mapping.setMessageReaders(this.codecConfigurer.getReaders());
7070

7171
Mono<Object> result = mapping.getHandler(this.exchange);
7272

@@ -80,7 +80,7 @@ public void normal() {
8080
public void noMatch() {
8181
RouterFunction<ServerResponse> routerFunction = request -> Mono.empty();
8282
RouterFunctionMapping mapping = new RouterFunctionMapping(routerFunction);
83-
mapping.setMessageCodecConfigurer(this.codecConfigurer);
83+
mapping.setMessageReaders(this.codecConfigurer.getReaders());
8484

8585
Mono<Object> result = mapping.getHandler(this.exchange);
8686

0 commit comments

Comments
 (0)