Browse Source

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
pull/1332/head
Dave Syer 12 years ago
parent
commit
05e6af23cf
  1. 20
      spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/HttpMessageConverters.java
  2. 9
      spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/HttpMessageConvertersTests.java

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

@ -75,15 +75,7 @@ public class HttpMessageConverters implements Iterable<HttpMessageConverter<?>> @@ -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<?>> @@ -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();

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

@ -69,6 +69,15 @@ public class HttpMessageConvertersTests { @@ -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…
Cancel
Save