Skip to content

Commit 24834f6

Browse files
committed
Add extendMessageConverters to WebMvcConfigurer
Issue: SPR-12450
1 parent f39c505 commit 24834f6

File tree

7 files changed

+61
-9
lines changed

7 files changed

+61
-9
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ protected void configureMessageConverters(List<HttpMessageConverter<?>> converte
105105
this.configurers.configureMessageConverters(converters);
106106
}
107107

108+
@Override
109+
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
110+
this.configurers.extendMessageConverters(converters);
111+
}
112+
108113
@Override
109114
protected void addFormatters(FormatterRegistry registry) {
110115
this.configurers.addFormatters(registry);

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,7 @@ protected final List<HttpMessageConverter<?>> getMessageConverters() {
629629
if (this.messageConverters.isEmpty()) {
630630
addDefaultHttpMessageConverters(this.messageConverters);
631631
}
632+
extendMessageConverters(this.messageConverters);
632633
}
633634
return this.messageConverters;
634635
}
@@ -646,6 +647,9 @@ protected final List<HttpMessageConverter<?>> getMessageConverters() {
646647
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
647648
}
648649

650+
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
651+
}
652+
649653
/**
650654
* Adds a set of default HttpMessageConverter instances to the given list.
651655
* Subclasses can call this method from {@link #configureMessageConverters(List)}.

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,26 @@ public interface WebMvcConfigurer {
5353
void addFormatters(FormatterRegistry registry);
5454

5555
/**
56-
* Configure the {@link HttpMessageConverter}s to use in argument resolvers
57-
* and return value handlers that support reading and/or writing to the
58-
* body of the request and response. If no message converters are added to
59-
* the list, default converters are added instead.
56+
* Configure the {@link HttpMessageConverter}s to use for reading or writing
57+
* to the body of the request or response. If no converters are added, a
58+
* default list of converters is registered.
59+
* <p><strong>Note</strong> that adding converters to the list, turns off
60+
* default converter registration. To simply add a converter without impacting
61+
* default registration, consider using the method
62+
* {@link #extendMessageConverters(java.util.List)} instead.
6063
* @param converters initially an empty list of converters
6164
*/
6265
void configureMessageConverters(List<HttpMessageConverter<?>> converters);
6366

67+
/**
68+
* A hook for extending or modifying the list of converters after it has been
69+
* configured. This may be useful for example to allow default converters to
70+
* be registered and then insert a custom converter through this method.
71+
* @param converters the list of configured converters to extend.
72+
* @since 4.1.3
73+
*/
74+
void extendMessageConverters(List<HttpMessageConverter<?>> converters);
75+
6476
/**
6577
* Provide a custom {@link Validator} instead of the one created by default.
6678
* The default implementation, assuming JSR-303 is on the classpath, is:

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,14 @@ public void addFormatters(FormatterRegistry registry) {
5151
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
5252
}
5353

54+
/**
55+
* {@inheritDoc}
56+
* <p>This implementation is empty.
57+
*/
58+
@Override
59+
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
60+
}
61+
5462
/**
5563
* {@inheritDoc}
5664
* <p>This implementation returns {@code null}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,13 @@ public void configureMessageConverters(List<HttpMessageConverter<?>> converters)
7878
}
7979
}
8080

81+
@Override
82+
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
83+
for (WebMvcConfigurer delegate : this.delegates) {
84+
delegate.extendMessageConverters(converters);
85+
}
86+
}
87+
8188
@Override
8289
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
8390
for (WebMvcConfigurer delegate : this.delegates) {

spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfigurationTests.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
import org.springframework.core.convert.ConversionService;
3131
import org.springframework.format.support.FormattingConversionService;
32+
import org.springframework.http.HttpMessage;
3233
import org.springframework.http.converter.HttpMessageConverter;
3334
import org.springframework.http.converter.StringHttpMessageConverter;
3435
import org.springframework.util.PathMatcher;
@@ -115,18 +116,26 @@ public void requestMappingHandlerAdapter() throws Exception {
115116

116117
@Test
117118
public void configureMessageConverters() {
119+
final HttpMessageConverter customConverter = mock(HttpMessageConverter.class);
120+
final StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
118121
List<WebMvcConfigurer> configurers = new ArrayList<WebMvcConfigurer>();
119122
configurers.add(new WebMvcConfigurerAdapter() {
120123
@Override
121124
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
122-
converters.add(new StringHttpMessageConverter());
125+
converters.add(stringConverter);
126+
}
127+
@Override
128+
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
129+
converters.add(0, customConverter);
123130
}
124131
});
125132
delegatingConfig = new DelegatingWebMvcConfiguration();
126133
delegatingConfig.setConfigurers(configurers);
127134

128135
RequestMappingHandlerAdapter adapter = delegatingConfig.requestMappingHandlerAdapter();
129-
assertEquals("Only one custom converter should be registered", 1, adapter.getMessageConverters().size());
136+
assertEquals("Only one custom converter should be registered", 2, adapter.getMessageConverters().size());
137+
assertSame(customConverter, adapter.getMessageConverters().get(0));
138+
assertSame(stringConverter, adapter.getMessageConverters().get(1));
130139
}
131140

132141
@Test

spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportExtensionTests.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.springframework.http.HttpStatus;
3434
import org.springframework.http.MediaType;
3535
import org.springframework.http.converter.HttpMessageConverter;
36+
import org.springframework.http.converter.StringHttpMessageConverter;
3637
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
3738
import org.springframework.mock.web.test.MockHttpServletRequest;
3839
import org.springframework.mock.web.test.MockServletContext;
@@ -165,9 +166,10 @@ public void requestMappingHandlerAdapter() throws Exception {
165166
assertEquals("converted", actual);
166167

167168
// Message converters
168-
assertEquals(1, adapter.getMessageConverters().size());
169-
assertEquals(MappingJackson2HttpMessageConverter.class, adapter.getMessageConverters().get(0).getClass());
170-
ObjectMapper objectMapper = ((MappingJackson2HttpMessageConverter)adapter.getMessageConverters().get(0)).getObjectMapper();
169+
assertEquals(2, adapter.getMessageConverters().size());
170+
assertEquals(StringHttpMessageConverter.class, adapter.getMessageConverters().get(0).getClass());
171+
assertEquals(MappingJackson2HttpMessageConverter.class, adapter.getMessageConverters().get(1).getClass());
172+
ObjectMapper objectMapper = ((MappingJackson2HttpMessageConverter)adapter.getMessageConverters().get(1)).getObjectMapper();
171173
assertFalse(objectMapper.getDeserializationConfig().isEnabled(MapperFeature.DEFAULT_VIEW_INCLUSION));
172174
assertFalse(objectMapper.getSerializationConfig().isEnabled(MapperFeature.DEFAULT_VIEW_INCLUSION));
173175
assertFalse(objectMapper.getDeserializationConfig().isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES));
@@ -301,6 +303,11 @@ public void configureMessageConverters(List<HttpMessageConverter<?>> converters)
301303
converters.add(new MappingJackson2HttpMessageConverter());
302304
}
303305

306+
@Override
307+
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
308+
converters.add(0, new StringHttpMessageConverter());
309+
}
310+
304311
@Override
305312
public Validator getValidator() {
306313
return new Validator() {

0 commit comments

Comments
 (0)