Skip to content

Commit 05e6af2

Browse files
author
Dave Syer
committed
Prepend without replacing in HttpMessageConverters
It was incorrect to simply replace existing instances because you can't tell from the instance which media types and java types it supports. This fix just prepends the custom converters so they get higher priority. Fixes gh-1293
1 parent 702253b commit 05e6af2

File tree

2 files changed

+10
-19
lines changed

2 files changed

+10
-19
lines changed

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/HttpMessageConverters.java

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -75,15 +75,7 @@ public HttpMessageConverters(HttpMessageConverter<?>... additionalConverters) {
7575
public HttpMessageConverters(Collection<HttpMessageConverter<?>> additionalConverters) {
7676
List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>();
7777
List<HttpMessageConverter<?>> defaultConverters = getDefaultConverters();
78-
for (HttpMessageConverter<?> converter : additionalConverters) {
79-
int defaultConverterIndex = indexOfItemClass(defaultConverters, converter);
80-
if (defaultConverterIndex == -1) {
81-
converters.add(converter);
82-
}
83-
else {
84-
defaultConverters.set(defaultConverterIndex, converter);
85-
}
86-
}
78+
converters.addAll(additionalConverters);
8779
converters.addAll(defaultConverters);
8880
this.converters = Collections.unmodifiableList(converters);
8981
}
@@ -120,16 +112,6 @@ private void reorderXmlConvertersToEnd(List<HttpMessageConverter<?>> converters)
120112
converters.addAll(xml);
121113
}
122114

123-
private <E> int indexOfItemClass(List<E> list, E item) {
124-
Class<? extends Object> itemClass = item.getClass();
125-
for (int i = 0; i < list.size(); i++) {
126-
if (list.get(i).getClass().isAssignableFrom(itemClass)) {
127-
return i;
128-
}
129-
}
130-
return -1;
131-
}
132-
133115
@Override
134116
public Iterator<HttpMessageConverter<?>> iterator() {
135117
return getConverters().iterator();

spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/HttpMessageConvertersTests.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,15 @@ public void overrideExistingConverter() {
6969
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
7070
HttpMessageConverters converters = new HttpMessageConverters(converter);
7171
assertTrue(converters.getConverters().contains(converter));
72+
int count = 0;
73+
for (HttpMessageConverter<?> httpMessageConverter : converters) {
74+
if (httpMessageConverter instanceof MappingJackson2HttpMessageConverter) {
75+
count++;
76+
}
77+
}
78+
// The existing converter is still there, but with a lower priority
79+
assertEquals(2, count);
80+
assertEquals(0, converters.getConverters().indexOf(converter));
7281
}
7382

7483
@Test

0 commit comments

Comments
 (0)