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:
parent
702253bc08
commit
05e6af23cf
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue