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
This commit is contained in:
Dave Syer 2014-07-28 09:30:34 -07:00
parent 702253bc08
commit 05e6af23cf
2 changed files with 10 additions and 19 deletions

View File

@ -75,15 +75,7 @@ public class HttpMessageConverters implements Iterable<HttpMessageConverter<?>>
public HttpMessageConverters(Collection<HttpMessageConverter<?>> additionalConverters) {
List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>();
List<HttpMessageConverter<?>> defaultConverters = getDefaultConverters();
for (HttpMessageConverter<?> converter : additionalConverters) {
int defaultConverterIndex = indexOfItemClass(defaultConverters, converter);
if (defaultConverterIndex == -1) {
converters.add(converter);
}
else {
defaultConverters.set(defaultConverterIndex, converter);
}
}
converters.addAll(additionalConverters);
converters.addAll(defaultConverters);
this.converters = Collections.unmodifiableList(converters);
}
@ -120,16 +112,6 @@ public class HttpMessageConverters implements Iterable<HttpMessageConverter<?>>
converters.addAll(xml);
}
private <E> int indexOfItemClass(List<E> list, E item) {
Class<? extends Object> itemClass = item.getClass();
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getClass().isAssignableFrom(itemClass)) {
return i;
}
}
return -1;
}
@Override
public Iterator<HttpMessageConverter<?>> iterator() {
return getConverters().iterator();

View File

@ -69,6 +69,15 @@ public class HttpMessageConvertersTests {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
HttpMessageConverters converters = new HttpMessageConverters(converter);
assertTrue(converters.getConverters().contains(converter));
int count = 0;
for (HttpMessageConverter<?> httpMessageConverter : converters) {
if (httpMessageConverter instanceof MappingJackson2HttpMessageConverter) {
count++;
}
}
// The existing converter is still there, but with a lower priority
assertEquals(2, count);
assertEquals(0, converters.getConverters().indexOf(converter));
}
@Test