提交 e860fa9a 编写于 作者: R Rossen Stoyanchev

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
上级 2b4a5169
...@@ -149,6 +149,10 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat ...@@ -149,6 +149,10 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat
this.messageConverters.add(new ResourceHttpMessageConverter()); this.messageConverters.add(new ResourceHttpMessageConverter());
this.messageConverters.add(new SourceHttpMessageConverter()); this.messageConverters.add(new SourceHttpMessageConverter());
this.messageConverters.add(new XmlAwareFormHttpMessageConverter()); this.messageConverters.add(new XmlAwareFormHttpMessageConverter());
if (romePresent) {
this.messageConverters.add(new AtomFeedHttpMessageConverter());
this.messageConverters.add(new RssChannelHttpMessageConverter());
}
if (jaxb2Present) { if (jaxb2Present) {
this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter()); this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
} }
...@@ -158,10 +162,6 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat ...@@ -158,10 +162,6 @@ public class RestTemplate extends InterceptingHttpAccessor implements RestOperat
else if (jacksonPresent) { else if (jacksonPresent) {
this.messageConverters.add(new MappingJacksonHttpMessageConverter()); this.messageConverters.add(new MappingJacksonHttpMessageConverter());
} }
if (romePresent) {
this.messageConverters.add(new AtomFeedHttpMessageConverter());
this.messageConverters.add(new RssChannelHttpMessageConverter());
}
} }
/** /**
......
...@@ -302,14 +302,17 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { ...@@ -302,14 +302,17 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
messageConverters.setSource(source); messageConverters.setSource(source);
messageConverters.add(createConverterBeanDefinition(ByteArrayHttpMessageConverter.class, source)); messageConverters.add(createConverterBeanDefinition(ByteArrayHttpMessageConverter.class, source));
RootBeanDefinition stringConverterDef = createConverterBeanDefinition(StringHttpMessageConverter.class, RootBeanDefinition stringConverterDef = createConverterBeanDefinition(StringHttpMessageConverter.class, source);
source);
stringConverterDef.getPropertyValues().add("writeAcceptCharset", false); stringConverterDef.getPropertyValues().add("writeAcceptCharset", false);
messageConverters.add(stringConverterDef); messageConverters.add(stringConverterDef);
messageConverters.add(createConverterBeanDefinition(ResourceHttpMessageConverter.class, source)); messageConverters.add(createConverterBeanDefinition(ResourceHttpMessageConverter.class, source));
messageConverters.add(createConverterBeanDefinition(SourceHttpMessageConverter.class, source)); messageConverters.add(createConverterBeanDefinition(SourceHttpMessageConverter.class, source));
messageConverters.add(createConverterBeanDefinition(XmlAwareFormHttpMessageConverter.class, source)); messageConverters.add(createConverterBeanDefinition(XmlAwareFormHttpMessageConverter.class, source));
if (romePresent) {
messageConverters.add(createConverterBeanDefinition(AtomFeedHttpMessageConverter.class, source));
messageConverters.add(createConverterBeanDefinition(RssChannelHttpMessageConverter.class, source));
}
if (jaxb2Present) { if (jaxb2Present) {
messageConverters messageConverters
.add(createConverterBeanDefinition(Jaxb2RootElementHttpMessageConverter.class, source)); .add(createConverterBeanDefinition(Jaxb2RootElementHttpMessageConverter.class, source));
...@@ -320,16 +323,13 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { ...@@ -320,16 +323,13 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
else if (jacksonPresent) { else if (jacksonPresent) {
messageConverters.add(createConverterBeanDefinition(MappingJacksonHttpMessageConverter.class, source)); messageConverters.add(createConverterBeanDefinition(MappingJacksonHttpMessageConverter.class, source));
} }
if (romePresent) {
messageConverters.add(createConverterBeanDefinition(AtomFeedHttpMessageConverter.class, source));
messageConverters.add(createConverterBeanDefinition(RssChannelHttpMessageConverter.class, source));
}
} }
return messageConverters; return messageConverters;
} }
private RootBeanDefinition createConverterBeanDefinition(Class<? extends HttpMessageConverter> converterClass, private RootBeanDefinition createConverterBeanDefinition(
Object source) { Class<? extends HttpMessageConverter> converterClass, Object source) {
RootBeanDefinition beanDefinition = new RootBeanDefinition(converterClass); RootBeanDefinition beanDefinition = new RootBeanDefinition(converterClass);
beanDefinition.setSource(source); beanDefinition.setSource(source);
beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
......
...@@ -138,6 +138,20 @@ import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolv ...@@ -138,6 +138,20 @@ import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolv
*/ */
public class WebMvcConfigurationSupport implements ApplicationContextAware, ServletContextAware { 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 ServletContext servletContext;
private ApplicationContext applicationContext; private ApplicationContext applicationContext;
...@@ -435,21 +449,19 @@ public class WebMvcConfigurationSupport implements ApplicationContextAware, Serv ...@@ -435,21 +449,19 @@ public class WebMvcConfigurationSupport implements ApplicationContextAware, Serv
messageConverters.add(new ResourceHttpMessageConverter()); messageConverters.add(new ResourceHttpMessageConverter());
messageConverters.add(new SourceHttpMessageConverter<Source>()); messageConverters.add(new SourceHttpMessageConverter<Source>());
messageConverters.add(new XmlAwareFormHttpMessageConverter()); messageConverters.add(new XmlAwareFormHttpMessageConverter());
if (romePresent) {
ClassLoader classLoader = getClass().getClassLoader(); messageConverters.add(new AtomFeedHttpMessageConverter());
if (ClassUtils.isPresent("javax.xml.bind.Binder", classLoader)) { messageConverters.add(new RssChannelHttpMessageConverter());
}
if (jaxb2Present) {
messageConverters.add(new Jaxb2RootElementHttpMessageConverter()); messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
} }
if (ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader)) { if (jackson2Present) {
messageConverters.add(new MappingJackson2HttpMessageConverter()); messageConverters.add(new MappingJackson2HttpMessageConverter());
} }
else if (ClassUtils.isPresent("org.codehaus.jackson.map.ObjectMapper", classLoader)) { else if (jacksonPresent) {
messageConverters.add(new MappingJacksonHttpMessageConverter()); messageConverters.add(new MappingJacksonHttpMessageConverter());
} }
if (ClassUtils.isPresent("com.sun.syndication.feed.WireFeed", classLoader)) {
messageConverters.add(new AtomFeedHttpMessageConverter());
messageConverters.add(new RssChannelHttpMessageConverter());
}
} }
/** /**
......
...@@ -20,6 +20,7 @@ Changes in version 3.2 M2 (2012-08-xx) ...@@ -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) * DispatcherPortlet does not forward event exceptions to the render phase by default (SPR-9287)
* add defaultCharset property to StringHttpMessageConverter * add defaultCharset property to StringHttpMessageConverter
* add @ExceptionResolver annotation to detect classes with @ExceptionHandler methods * 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) Changes in version 3.2 M1 (2012-05-28)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册