From e860fa9a8b56459998911768a3fc791fa4d53b0f Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 6 Jul 2012 16:00:22 -0400 Subject: [PATCH] Move feed message converters ahead of jackson/jaxb2 The Atom/RSS message converters are now registered ahead of the Jackson and the JAXB2 message converters by default. Since the Atom and RSS converters convert to and from very specific object types Feed and Channel respectively, that shouldn't introduce any regressions and will work more intuitively when the requested media type is "*/*". Issue: SPR-9054 --- .../web/client/RestTemplate.java | 8 ++--- .../AnnotationDrivenBeanDefinitionParser.java | 16 +++++----- .../WebMvcConfigurationSupport.java | 30 +++++++++++++------ src/dist/changelog.txt | 1 + 4 files changed, 34 insertions(+), 21 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java b/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java index 6e6bcf5ab3c..ce0f5bdf6e9 100644 --- a/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java +++ b/spring-web/src/main/java/org/springframework/web/client/RestTemplate.java @@ -149,6 +149,10 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat this.messageConverters.add(new ResourceHttpMessageConverter()); this.messageConverters.add(new SourceHttpMessageConverter()); this.messageConverters.add(new XmlAwareFormHttpMessageConverter()); + if (romePresent) { + this.messageConverters.add(new AtomFeedHttpMessageConverter()); + this.messageConverters.add(new RssChannelHttpMessageConverter()); + } if (jaxb2Present) { this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter()); } @@ -158,10 +162,6 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat else if (jacksonPresent) { this.messageConverters.add(new MappingJacksonHttpMessageConverter()); } - if (romePresent) { - this.messageConverters.add(new AtomFeedHttpMessageConverter()); - this.messageConverters.add(new RssChannelHttpMessageConverter()); - } } /** diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java index 080565ea16a..cf0dafb584a 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java @@ -302,14 +302,17 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { messageConverters.setSource(source); messageConverters.add(createConverterBeanDefinition(ByteArrayHttpMessageConverter.class, source)); - RootBeanDefinition stringConverterDef = createConverterBeanDefinition(StringHttpMessageConverter.class, - source); + RootBeanDefinition stringConverterDef = createConverterBeanDefinition(StringHttpMessageConverter.class, source); stringConverterDef.getPropertyValues().add("writeAcceptCharset", false); messageConverters.add(stringConverterDef); messageConverters.add(createConverterBeanDefinition(ResourceHttpMessageConverter.class, source)); messageConverters.add(createConverterBeanDefinition(SourceHttpMessageConverter.class, source)); messageConverters.add(createConverterBeanDefinition(XmlAwareFormHttpMessageConverter.class, source)); + if (romePresent) { + messageConverters.add(createConverterBeanDefinition(AtomFeedHttpMessageConverter.class, source)); + messageConverters.add(createConverterBeanDefinition(RssChannelHttpMessageConverter.class, source)); + } if (jaxb2Present) { messageConverters .add(createConverterBeanDefinition(Jaxb2RootElementHttpMessageConverter.class, source)); @@ -320,16 +323,13 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { else if (jacksonPresent) { messageConverters.add(createConverterBeanDefinition(MappingJacksonHttpMessageConverter.class, source)); } - if (romePresent) { - messageConverters.add(createConverterBeanDefinition(AtomFeedHttpMessageConverter.class, source)); - messageConverters.add(createConverterBeanDefinition(RssChannelHttpMessageConverter.class, source)); - } } return messageConverters; } - private RootBeanDefinition createConverterBeanDefinition(Class converterClass, - Object source) { + private RootBeanDefinition createConverterBeanDefinition( + Class converterClass, Object source) { + RootBeanDefinition beanDefinition = new RootBeanDefinition(converterClass); beanDefinition.setSource(source); beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java index be25fcdd6d8..44a75784fc7 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java @@ -138,6 +138,20 @@ import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolv */ public class WebMvcConfigurationSupport implements ApplicationContextAware, ServletContextAware { + private static final boolean jaxb2Present = + ClassUtils.isPresent("javax.xml.bind.Binder", WebMvcConfigurationSupport.class.getClassLoader()); + + private static final boolean jackson2Present = + ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", WebMvcConfigurationSupport.class.getClassLoader()) && + ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", WebMvcConfigurationSupport.class.getClassLoader()); + + private static final boolean jacksonPresent = + ClassUtils.isPresent("org.codehaus.jackson.map.ObjectMapper", WebMvcConfigurationSupport.class.getClassLoader()) && + ClassUtils.isPresent("org.codehaus.jackson.JsonGenerator", WebMvcConfigurationSupport.class.getClassLoader()); + + private static boolean romePresent = + ClassUtils.isPresent("com.sun.syndication.feed.WireFeed", WebMvcConfigurationSupport.class.getClassLoader()); + private ServletContext servletContext; private ApplicationContext applicationContext; @@ -435,21 +449,19 @@ public class WebMvcConfigurationSupport implements ApplicationContextAware, Serv messageConverters.add(new ResourceHttpMessageConverter()); messageConverters.add(new SourceHttpMessageConverter()); messageConverters.add(new XmlAwareFormHttpMessageConverter()); - - ClassLoader classLoader = getClass().getClassLoader(); - if (ClassUtils.isPresent("javax.xml.bind.Binder", classLoader)) { + if (romePresent) { + messageConverters.add(new AtomFeedHttpMessageConverter()); + messageConverters.add(new RssChannelHttpMessageConverter()); + } + if (jaxb2Present) { messageConverters.add(new Jaxb2RootElementHttpMessageConverter()); } - if (ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader)) { + if (jackson2Present) { messageConverters.add(new MappingJackson2HttpMessageConverter()); } - else if (ClassUtils.isPresent("org.codehaus.jackson.map.ObjectMapper", classLoader)) { + else if (jacksonPresent) { messageConverters.add(new MappingJacksonHttpMessageConverter()); } - if (ClassUtils.isPresent("com.sun.syndication.feed.WireFeed", classLoader)) { - messageConverters.add(new AtomFeedHttpMessageConverter()); - messageConverters.add(new RssChannelHttpMessageConverter()); - } } /** diff --git a/src/dist/changelog.txt b/src/dist/changelog.txt index 7c9e6dd11b1..cc0bcca8c78 100644 --- a/src/dist/changelog.txt +++ b/src/dist/changelog.txt @@ -20,6 +20,7 @@ Changes in version 3.2 M2 (2012-08-xx) * DispatcherPortlet does not forward event exceptions to the render phase by default (SPR-9287) * add defaultCharset property to StringHttpMessageConverter * add @ExceptionResolver annotation to detect classes with @ExceptionHandler methods +* move RSS/Atom message converter registration ahead of jackson/jaxb2 Changes in version 3.2 M1 (2012-05-28)