From 540845e61315f811e87dc96984bcbc036633a987 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Mon, 28 Nov 2011 14:35:08 +0000 Subject: [PATCH] added getObjectMapper() accessor to MappingJacksonHttpMessageConverter (SPR-8605) --- .../MappingJacksonHttpMessageConverter.java | 54 ++++++++++++------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/org.springframework.web/src/main/java/org/springframework/http/converter/json/MappingJacksonHttpMessageConverter.java b/org.springframework.web/src/main/java/org/springframework/http/converter/json/MappingJacksonHttpMessageConverter.java index ba1bf128f3..48a3cfd932 100644 --- a/org.springframework.web/src/main/java/org/springframework/http/converter/json/MappingJacksonHttpMessageConverter.java +++ b/org.springframework.web/src/main/java/org/springframework/http/converter/json/MappingJacksonHttpMessageConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2011 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,14 +16,16 @@ package org.springframework.http.converter.json; +import java.io.EOFException; import java.io.IOException; import java.nio.charset.Charset; import java.util.List; import org.codehaus.jackson.JsonEncoding; -import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.JsonGenerationException; +import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.JsonParseException; +import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.type.TypeFactory; import org.codehaus.jackson.type.JavaType; @@ -66,39 +68,49 @@ public class MappingJacksonHttpMessageConverter extends AbstractHttpMessageConve } /** - * Sets the {@code ObjectMapper} for this view. If not set, a default + * Set the {@code ObjectMapper} for this view. If not set, a default * {@link ObjectMapper#ObjectMapper() ObjectMapper} is used. - *

Setting a custom-configured {@code ObjectMapper} is one way to take further control of the JSON serialization - * process. For example, an extended {@link org.codehaus.jackson.map.SerializerFactory} can be configured that provides - * custom serializers for specific types. The other option for refining the serialization process is to use Jackson's - * provided annotations on the types to be serialized, in which case a custom-configured ObjectMapper is unnecessary. + *

Setting a custom-configured {@code ObjectMapper} is one way to take further control of the JSON + * serialization process. For example, an extended {@link org.codehaus.jackson.map.SerializerFactory} + * can be configured that provides custom serializers for specific types. The other option for refining + * the serialization process is to use Jackson's provided annotations on the types to be serialized, + * in which case a custom-configured ObjectMapper is unnecessary. */ public void setObjectMapper(ObjectMapper objectMapper) { - Assert.notNull(objectMapper, "'objectMapper' must not be null"); + Assert.notNull(objectMapper, "ObjectMapper must not be null"); this.objectMapper = objectMapper; } /** - * Indicates whether the JSON output by this view should be prefixed with "{} &&". Default is false. - *

Prefixing the JSON string in this manner is used to help prevent JSON Hijacking. The prefix renders the string - * syntactically invalid as a script so that it cannot be hijacked. This prefix does not affect the evaluation of JSON, - * but if JSON validation is performed on the string, the prefix would need to be ignored. + * Return the underlying {@code ObjectMapper} for this view. + */ + public ObjectMapper getObjectMapper() { + return this.objectMapper; + } + + /** + * Indicate whether the JSON output by this view should be prefixed with "{} &&". Default is false. + *

Prefixing the JSON string in this manner is used to help prevent JSON Hijacking. + * The prefix renders the string syntactically invalid as a script so that it cannot be hijacked. + * This prefix does not affect the evaluation of JSON, but if JSON validation is performed on the + * string, the prefix would need to be ignored. */ public void setPrefixJson(boolean prefixJson) { this.prefixJson = prefixJson; } + @Override public boolean canRead(Class clazz, MediaType mediaType) { JavaType javaType = getJavaType(clazz); - return this.objectMapper.canDeserialize(javaType) && canRead(mediaType); + return (this.objectMapper.canDeserialize(javaType) && canRead(mediaType)); } /** * Returns the Jackson {@link JavaType} for the specific class. - * - *

Default implementation returns {@link TypeFactory#type(java.lang.reflect.Type)}, but this can be overridden - * in subclasses, to allow for custom generic collection handling. For instance: + *

The default implementation returns {@link TypeFactory#type(java.lang.reflect.Type)}, + * but this can be overridden in subclasses, to allow for custom generic collection handling. + * For instance: *

 	 * protected JavaType getJavaType(Class<?> clazz) {
 	 *   if (List.class.isAssignableFrom(clazz)) {
@@ -108,7 +120,6 @@ public class MappingJacksonHttpMessageConverter extends AbstractHttpMessageConve
 	 *   }
 	 * }
 	 * 
- * * @param clazz the class to return the java type for * @return the java type */ @@ -118,7 +129,7 @@ public class MappingJacksonHttpMessageConverter extends AbstractHttpMessageConve @Override public boolean canWrite(Class clazz, MediaType mediaType) { - return this.objectMapper.canSerialize(clazz) && canWrite(mediaType); + return (this.objectMapper.canSerialize(clazz) && canWrite(mediaType)); } @Override @@ -130,6 +141,7 @@ public class MappingJacksonHttpMessageConverter extends AbstractHttpMessageConve @Override protected Object readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { + JavaType javaType = getJavaType(clazz); try { return this.objectMapper.readValue(inputMessage.getBody(), javaType); @@ -137,6 +149,12 @@ public class MappingJacksonHttpMessageConverter extends AbstractHttpMessageConve catch (JsonParseException ex) { throw new HttpMessageNotReadableException("Could not read JSON: " + ex.getMessage(), ex); } + catch (JsonMappingException ex) { + throw new HttpMessageNotReadableException("Could not read JSON: " + ex.getMessage(), ex); + } + catch (EOFException ex) { + throw new HttpMessageNotReadableException("Could not read JSON: " + ex.getMessage(), ex); + } } @Override