From 05e6af23cf2e60d5c61388fbb954bd56f00b9f94 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Mon, 28 Jul 2014 09:30:34 -0700 Subject: [PATCH] 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 --- .../web/HttpMessageConverters.java | 20 +------------------ .../web/HttpMessageConvertersTests.java | 9 +++++++++ 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/HttpMessageConverters.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/HttpMessageConverters.java index ef903d4806d..ac52b71fd98 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/HttpMessageConverters.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/HttpMessageConverters.java @@ -75,15 +75,7 @@ public class HttpMessageConverters implements Iterable> public HttpMessageConverters(Collection> additionalConverters) { List> converters = new ArrayList>(); List> 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> converters.addAll(xml); } - private int indexOfItemClass(List list, E item) { - Class 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> iterator() { return getConverters().iterator(); diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/HttpMessageConvertersTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/HttpMessageConvertersTests.java index 0d26af9144c..49ad34abf80 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/HttpMessageConvertersTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/HttpMessageConvertersTests.java @@ -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