AbstractJackson2HttpMessageConverter's canRead/canWrite checks media type first before delegating to Jackson

Issue: SPR-14163
This commit is contained in:
Juergen Hoeller 2016-04-13 18:34:22 +02:00
parent ee31617ebe
commit e3667467f6
2 changed files with 27 additions and 8 deletions

View File

@ -71,13 +71,20 @@ public abstract class AbstractHttpMessageConverter<T> 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<T> 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<T> 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.

View File

@ -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<Throwable> causeRef = new AtomicReference<Throwable>();
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<Throwable> causeRef = new AtomicReference<Throwable>();
if (this.objectMapper.canSerialize(clazz, causeRef) && canWrite(mediaType)) {
if (this.objectMapper.canSerialize(clazz, causeRef)) {
return true;
}
Throwable cause = causeRef.get();