org.springframework.http.converter.json
Class MappingJacksonHttpMessageConverter

java.lang.Object
  extended by org.springframework.http.converter.AbstractHttpMessageConverter<Object>
      extended by org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
All Implemented Interfaces:
HttpMessageConverter<Object>

public class MappingJacksonHttpMessageConverter
extends AbstractHttpMessageConverter<Object>

Implementation of HttpMessageConverter that can read and write JSON using Jackson's ObjectMapper.

This converter can be used to bind to typed beans, or untyped HashMap instances.

By default, this converter supports application/json. This can be overridden by setting the supportedMediaTypes property.

Since:
3.0
Author:
Arjen Poutsma
See Also:
MappingJacksonJsonView

Field Summary
static Charset DEFAULT_CHARSET
           
 
Fields inherited from class org.springframework.http.converter.AbstractHttpMessageConverter
logger
 
Constructor Summary
MappingJacksonHttpMessageConverter()
          Construct a new BindingJacksonHttpMessageConverter.
 
Method Summary
 boolean canRead(Class<?> clazz, MediaType mediaType)
          Indicates whether the given class can be read by this converter.
 boolean canWrite(Class<?> clazz, MediaType mediaType)
          Indicates whether the given class can be written by this converter.
protected  org.codehaus.jackson.type.JavaType getJavaType(Class<?> clazz)
          Return the Jackson JavaType for the specified class.
protected  org.codehaus.jackson.JsonEncoding getJsonEncoding(MediaType contentType)
          Determine the JSON encoding to use for the given content type.
 org.codehaus.jackson.map.ObjectMapper getObjectMapper()
          Return the underlying ObjectMapper for this view.
protected  Object readInternal(Class<?> clazz, HttpInputMessage inputMessage)
          Abstract template method that reads the actualy object.
 void setObjectMapper(org.codehaus.jackson.map.ObjectMapper objectMapper)
          Set the ObjectMapper for this view.
 void setPrefixJson(boolean prefixJson)
          Indicate whether the JSON output by this view should be prefixed with "{} &&".
protected  boolean supports(Class<?> clazz)
          Indicates whether the given class is supported by this converter.
protected  void writeInternal(Object object, HttpOutputMessage outputMessage)
          Abstract template method that writes the actual body.
 
Methods inherited from class org.springframework.http.converter.AbstractHttpMessageConverter
canRead, canWrite, getContentLength, getDefaultContentType, getSupportedMediaTypes, read, setSupportedMediaTypes, write
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

DEFAULT_CHARSET

public static final Charset DEFAULT_CHARSET
Constructor Detail

MappingJacksonHttpMessageConverter

public MappingJacksonHttpMessageConverter()
Construct a new BindingJacksonHttpMessageConverter.

Method Detail

setObjectMapper

public void setObjectMapper(org.codehaus.jackson.map.ObjectMapper objectMapper)
Set the ObjectMapper for this view. If not set, a default ObjectMapper is used.

Setting a custom-configured ObjectMapper is one way to take further control of the JSON serialization process. For example, an extended 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.


getObjectMapper

public org.codehaus.jackson.map.ObjectMapper getObjectMapper()
Return the underlying ObjectMapper for this view.


setPrefixJson

public void setPrefixJson(boolean prefixJson)
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.


canRead

public boolean canRead(Class<?> clazz,
                       MediaType mediaType)
Description copied from class: AbstractHttpMessageConverter
Indicates whether the given class can be read by this converter.

This implementation checks if the given class is supported, and if the supported media types include the given media type.

Specified by:
canRead in interface HttpMessageConverter<Object>
Overrides:
canRead in class AbstractHttpMessageConverter<Object>
Parameters:
clazz - the class to test for readability
mediaType - the media type to read, can be null if not specified. Typically the value of a Content-Type header.
Returns:
true if readable; false otherwise

canWrite

public boolean canWrite(Class<?> clazz,
                        MediaType mediaType)
Description copied from class: AbstractHttpMessageConverter
Indicates whether the given class can be written by this converter.

This implementation checks if the given class is supported, and if the supported media types include the given media type.

Specified by:
canWrite in interface HttpMessageConverter<Object>
Overrides:
canWrite in class AbstractHttpMessageConverter<Object>
Parameters:
clazz - the class to test for writability
mediaType - the media type to write, can be null if not specified. Typically the value of an Accept header.
Returns:
true if writable; false otherwise

supports

protected boolean supports(Class<?> clazz)
Description copied from class: AbstractHttpMessageConverter
Indicates whether the given class is supported by this converter.

Specified by:
supports in class AbstractHttpMessageConverter<Object>
Parameters:
clazz - the class to test for support
Returns:
true if supported; false otherwise

readInternal

protected Object readInternal(Class<?> clazz,
                              HttpInputMessage inputMessage)
                       throws IOException,
                              HttpMessageNotReadableException
Description copied from class: AbstractHttpMessageConverter
Abstract template method that reads the actualy object. Invoked from AbstractHttpMessageConverter.read(java.lang.Class, org.springframework.http.HttpInputMessage).

Specified by:
readInternal in class AbstractHttpMessageConverter<Object>
Parameters:
clazz - the type of object to return
inputMessage - the HTTP input message to read from
Returns:
the converted object
Throws:
IOException - in case of I/O errors
HttpMessageNotReadableException - in case of conversion errors

writeInternal

protected void writeInternal(Object object,
                             HttpOutputMessage outputMessage)
                      throws IOException,
                             HttpMessageNotWritableException
Description copied from class: AbstractHttpMessageConverter
Abstract template method that writes the actual body. Invoked from AbstractHttpMessageConverter.write(T, org.springframework.http.MediaType, org.springframework.http.HttpOutputMessage).

Specified by:
writeInternal in class AbstractHttpMessageConverter<Object>
Parameters:
object - the object to write to the output message
outputMessage - the message to write to
Throws:
IOException - in case of I/O errors
HttpMessageNotWritableException - in case of conversion errors

getJavaType

protected org.codehaus.jackson.type.JavaType getJavaType(Class<?> clazz)
Return the Jackson JavaType for the specified class.

The default implementation returns 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)) {
     return TypeFactory.collectionType(ArrayList.class, MyBean.class);
   } else {
     return super.getJavaType(clazz);
   }
 }
 

Parameters:
clazz - the class to return the java type for
Returns:
the java type

getJsonEncoding

protected org.codehaus.jackson.JsonEncoding getJsonEncoding(MediaType contentType)
Determine the JSON encoding to use for the given content type.

Parameters:
contentType - the media type as requested by the caller
Returns:
the JSON encoding to use (never null)