From e3667467f627bc60e4e72df766facec66d37ec86 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 13 Apr 2016 18:34:22 +0200 Subject: [PATCH] AbstractJackson2HttpMessageConverter's canRead/canWrite checks media type first before delegating to Jackson Issue: SPR-14163 --- .../AbstractHttpMessageConverter.java | 21 +++++++++++++++---- .../AbstractJackson2HttpMessageConverter.java | 14 +++++++++---- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/converter/AbstractHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/AbstractHttpMessageConverter.java index 87cf6e050f2..331324a5c3d 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/AbstractHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/AbstractHttpMessageConverter.java @@ -71,13 +71,20 @@ public abstract class AbstractHttpMessageConverter implements HttpMessageConv } /** - * Construct an {@code AbstractHttpMessageConverter} with multiple supported media type. + * Construct an {@code AbstractHttpMessageConverter} with multiple supported media types. * @param supportedMediaTypes the supported media types */ protected AbstractHttpMessageConverter(MediaType... supportedMediaTypes) { setSupportedMediaTypes(Arrays.asList(supportedMediaTypes)); } + /** + * Construct an {@code AbstractHttpMessageConverter} with a default charset and + * multiple supported media types. + * @param defaultCharset the default character set + * @param supportedMediaTypes the supported media types + * @since 4.3 + */ protected AbstractHttpMessageConverter(Charset defaultCharset, MediaType... supportedMediaTypes) { this.defaultCharset = defaultCharset; setSupportedMediaTypes(Arrays.asList(supportedMediaTypes)); @@ -98,16 +105,22 @@ public abstract class AbstractHttpMessageConverter implements HttpMessageConv } /** - * Set the default character set if any. + * Set the default character set, if any. + * @since 4.3 */ public void setDefaultCharset(Charset defaultCharset) { this.defaultCharset = defaultCharset; } + /** + * Return the default character set, if any. + * @since 4.3 + */ public Charset getDefaultCharset() { - return defaultCharset; + return this.defaultCharset; } + /** * This implementation checks if the given class is {@linkplain #supports(Class) supported}, * and if the {@linkplain #getSupportedMediaTypes() supported media types} @@ -119,7 +132,7 @@ public abstract class AbstractHttpMessageConverter implements HttpMessageConv } /** - * Returns true if any of the {@linkplain #setSupportedMediaTypes(List) + * Returns {@code true} if any of the {@linkplain #setSupportedMediaTypes(List) * supported} media types {@link MediaType#includes(MediaType) include} the * given media type. * @param mediaType the media type to read, can be {@code null} if not specified. diff --git a/spring-web/src/main/java/org/springframework/http/converter/json/AbstractJackson2HttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/json/AbstractJackson2HttpMessageConverter.java index e96a0c67cf3..8df7454d702 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/json/AbstractJackson2HttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/json/AbstractJackson2HttpMessageConverter.java @@ -140,11 +140,14 @@ public abstract class AbstractJackson2HttpMessageConverter extends AbstractGener @Override public boolean canRead(Type type, Class contextClass, MediaType mediaType) { JavaType javaType = getJavaType(type, contextClass); + if (!canRead(mediaType)) { + return false; + } if (!logger.isWarnEnabled()) { - return (this.objectMapper.canDeserialize(javaType) && canRead(mediaType)); + return this.objectMapper.canDeserialize(javaType); } AtomicReference causeRef = new AtomicReference(); - if (this.objectMapper.canDeserialize(javaType, causeRef) && canRead(mediaType)) { + if (this.objectMapper.canDeserialize(javaType, causeRef)) { return true; } Throwable cause = causeRef.get(); @@ -162,11 +165,14 @@ public abstract class AbstractJackson2HttpMessageConverter extends AbstractGener @Override public boolean canWrite(Class clazz, MediaType mediaType) { + if (!canWrite(mediaType)) { + return false; + } if (!logger.isWarnEnabled()) { - return (this.objectMapper.canSerialize(clazz) && canWrite(mediaType)); + return this.objectMapper.canSerialize(clazz); } AtomicReference causeRef = new AtomicReference(); - if (this.objectMapper.canSerialize(clazz, causeRef) && canWrite(mediaType)) { + if (this.objectMapper.canSerialize(clazz, causeRef)) { return true; } Throwable cause = causeRef.get();