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 db752ddd0db..240e398f3d1 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 @@ -51,6 +51,14 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupp */ public class HttpMessageConverters implements Iterable> { + private static final List> NON_REPLACING_CONVERTERS; + static { + List> nonReplacingConverters = new ArrayList>(); + addClassIfExists(nonReplacingConverters, "org.springframework.hateoas.mvc." + + "TypeConstrainedMappingJackson2HttpMessageConverter"); + NON_REPLACING_CONVERTERS = Collections.unmodifiableList(nonReplacingConverters); + } + private final List> converters; /** @@ -95,8 +103,7 @@ public class HttpMessageConverters implements Iterable> Iterator> iterator = processing.iterator(); while (iterator.hasNext()) { HttpMessageConverter candidate = iterator.next(); - if (ClassUtils.isAssignableValue(defaultConverter.getClass(), - candidate)) { + if (isReplacement(defaultConverter, candidate)) { combined.add(candidate); iterator.remove(); } @@ -109,6 +116,16 @@ public class HttpMessageConverters implements Iterable> this.converters = Collections.unmodifiableList(combined); } + private boolean isReplacement(HttpMessageConverter defaultConverter, + HttpMessageConverter candidate) { + for (Class nonRelacingConverter : NON_REPLACING_CONVERTERS) { + if (nonRelacingConverter.isInstance(candidate)) { + return false; + } + } + return ClassUtils.isAssignableValue(defaultConverter.getClass(), candidate); + } + /** * Method that can be used to post-process the {@link HttpMessageConverter} list * before it is used. @@ -165,4 +182,13 @@ public class HttpMessageConverters implements Iterable> return this.converters; } + private static void addClassIfExists(List> list, String className) { + try { + list.add(Class.forName(className)); + } + catch (ClassNotFoundException ex) { + // Ignore + } + } + }