org.springframework.jms.support.converter

## Class MappingJacksonMessageConverter

- java.lang.Object
- - org.springframework.jms.support.converter.MappingJacksonMessageConverter

- All Implemented Interfaces:
    Aware, BeanClassLoaderAware, MessageConverter

      public class MappingJacksonMessageConverter
      extends Object
      implements MessageConverter, BeanClassLoaderAware

  Message converter that uses the Jackson library to convert messages to and from JSON. Maps an object to a `BytesMessage`, or to a `TextMessage` if the `targetType` is set to `MessageType.TEXT`. Converts from a `TextMessage` or `BytesMessage` to an object.
  Since:
    3.1
  Author:
    Mark Pollack, Dave Syer, Juergen Hoeller

- - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `static String` | `DEFAULT_ENCODING` The default encoding used for writing to text messages: UTF-8.

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `MappingJacksonMessageConverter()`

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `protected Object` | `convertFromBytesMessage(BytesMessage message, JavaType targetJavaType)` Convert a BytesMessage to a Java Object with the specified type.
    `protected Object` | `convertFromMessage(Message message, JavaType targetJavaType)` Template method that allows for custom message mapping.
    `protected Object` | `convertFromTextMessage(TextMessage message, JavaType targetJavaType)` Convert a TextMessage to a Java Object with the specified type.
    `Object` | `fromMessage(Message message)` Convert from a JMS Message to a Java object.
    `protected JavaType` | `getJavaTypeForMessage(Message message)` Determine a Jackson JavaType for the given JMS Message, typically parsing a type id message property.
    `protected BytesMessage` | `mapToBytesMessage(Object object, Session session, ObjectMapper objectMapper)` Map the given object to a `BytesMessage`.
    `protected Message` | `mapToMessage(Object object, Session session, ObjectMapper objectMapper, MessageType targetType)` Template method that allows for custom message mapping.
    `protected TextMessage` | `mapToTextMessage(Object object, Session session, ObjectMapper objectMapper)` Map the given object to a `TextMessage`.
    `void` | `setBeanClassLoader(ClassLoader classLoader)` Callback that supplies the bean `class loader` to a bean instance.
    `void` | `setEncoding(String encoding)` Specify the encoding to use when converting to and from text-based message body content.
    `void` | `setEncodingPropertyName(String encodingPropertyName)` Specify the name of the JMS message property that carries the encoding from bytes to String and back is BytesMessage is used during the conversion process.
    `void` | `setObjectMapper(ObjectMapper objectMapper)` Specify the `ObjectMapper` to use instead of using the default.
    `void` | `setTargetType(MessageType targetType)` Specify whether `toMessage(Object, Session)` should marshal to a `BytesMessage` or a `TextMessage`.
    `void` | `setTypeIdMappings(Map<String,Class<?>> typeIdMappings)` Specify mappings from type ids to Java classes, if desired.
    `protected void` | `setTypeIdOnMessage(Object object, Message message)` Set a type id for the given payload object on the given JMS Message.
    `void` | `setTypeIdPropertyName(String typeIdPropertyName)` Specify the name of the JMS message property that carries the type id for the contained object: either a mapped id value or a raw Java class name.
    `Message` | `toMessage(Object object, Session session)` Convert a Java object to a JMS Message using the supplied session to create the message object.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Field Detail

    - #### DEFAULT_ENCODING

          public static final String DEFAULT_ENCODING

      The default encoding used for writing to text messages: UTF-8.
      See Also:
        Constant Field Values

  - ### Constructor Detail

    - #### MappingJacksonMessageConverter

          public MappingJacksonMessageConverter()

  - ### Method Detail

    - #### setObjectMapper

          public void setObjectMapper(ObjectMapper objectMapper)

      Specify the `ObjectMapper` to use instead of using the default.

    - #### setTargetType

          public void setTargetType(MessageType targetType)

      Specify whether `toMessage(Object, Session)` should marshal to a `BytesMessage` or a `TextMessage`.

      The default is `MessageType.BYTES`, i.e. this converter marshals to a `BytesMessage`. Note that the default version of this converter supports `MessageType.BYTES` and `MessageType.TEXT` only.

      See Also:
        `MessageType.BYTES`, `MessageType.TEXT`

    - #### setEncoding

          public void setEncoding(String encoding)

      Specify the encoding to use when converting to and from text-based message body content. The default encoding will be "UTF-8".

      When reading from a a text-based message, an encoding may have been suggested through a special JMS property which will then be preferred over the encoding set on this MessageConverter instance.

      See Also:
        `setEncodingPropertyName(java.lang.String)`

    - #### setEncodingPropertyName

          public void setEncodingPropertyName(String encodingPropertyName)

      Specify the name of the JMS message property that carries the encoding from bytes to String and back is BytesMessage is used during the conversion process.

      Default is none. Setting this property is optional; if not set, UTF-8 will be used for decoding any incoming bytes message.

      See Also:
        `setEncoding(java.lang.String)`

    - #### setTypeIdPropertyName

          public void setTypeIdPropertyName(String typeIdPropertyName)

      Specify the name of the JMS message property that carries the type id for the contained object: either a mapped id value or a raw Java class name.

      Default is none. NOTE: This property needs to be set in order to allow for converting from an incoming message to a Java object.

      See Also:
        `setTypeIdMappings(java.util.Map<java.lang.String, java.lang.Class<?>>)`

    - #### setTypeIdMappings

          public void setTypeIdMappings(Map<String,Class<?>> typeIdMappings)

      Specify mappings from type ids to Java classes, if desired. This allows for synthetic ids in the type id message property, instead of transferring Java class names.

      Default is no custom mappings, i.e. transferring raw Java class names.

      Parameters:
        `typeIdMappings` - a Map with type id values as keys and Java classes as values

    - #### setBeanClassLoader

          public void setBeanClassLoader(ClassLoader classLoader)

      Description copied from interface: `BeanClassLoaderAware`
      Callback that supplies the bean `class loader` to a bean instance.

      Invoked after the population of normal bean properties but before an initialization callback such as `InitializingBean's` `InitializingBean.afterPropertiesSet()` method or a custom init-method.

      Specified by:
        `setBeanClassLoader` in interface `BeanClassLoaderAware`
      Parameters:
        `classLoader` - the owning class loader; may be `null` in which case a default `ClassLoader` must be used, for example the `ClassLoader` obtained via `ClassUtils.getDefaultClassLoader()`

    - #### toMessage

          public Message toMessage(Object object,
                          Session session)
                            throws JMSException,
                                   MessageConversionException

      Description copied from interface: `MessageConverter`
      Convert a Java object to a JMS Message using the supplied session to create the message object.
      Specified by:
        `toMessage` in interface `MessageConverter`
      Parameters:
        `object` - the object to convert
        `session` - the Session to use for creating a JMS Message
      Returns:
        the JMS Message
      Throws:
        `JMSException` - if thrown by JMS API methods
        `MessageConversionException` - in case of conversion failure

    - #### fromMessage

          public Object fromMessage(Message message)
                             throws JMSException,
                                    MessageConversionException

      Description copied from interface: `MessageConverter`
      Convert from a JMS Message to a Java object.
      Specified by:
        `fromMessage` in interface `MessageConverter`
      Parameters:
        `message` - the message to convert
      Returns:
        the converted Java object
      Throws:
        `JMSException` - if thrown by JMS API methods
        `MessageConversionException` - in case of conversion failure

    - #### mapToTextMessage

          protected TextMessage mapToTextMessage(Object object,
                                     Session session,
                                     ObjectMapper objectMapper)
                                          throws JMSException,
                                                 IOException

      Map the given object to a `TextMessage`.
      Parameters:
        `object` - the object to be mapped
        `session` - current JMS session
        `objectMapper` - the mapper to use
      Returns:
        the resulting message
      Throws:
        `JMSException` - if thrown by JMS methods
        `IOException` - in case of I/O errors
      See Also:
        `Session.createBytesMessage()`

    - #### mapToBytesMessage

          protected BytesMessage mapToBytesMessage(Object object,
                                       Session session,
                                       ObjectMapper objectMapper)
                                            throws JMSException,
                                                   IOException

      Map the given object to a `BytesMessage`.
      Parameters:
        `object` - the object to be mapped
        `session` - current JMS session
        `objectMapper` - the mapper to use
      Returns:
        the resulting message
      Throws:
        `JMSException` - if thrown by JMS methods
        `IOException` - in case of I/O errors
      See Also:
        `Session.createBytesMessage()`

    - #### mapToMessage

          protected Message mapToMessage(Object object,
                             Session session,
                             ObjectMapper objectMapper,
                             MessageType targetType)
                                  throws JMSException,
                                         IOException

      Template method that allows for custom message mapping. Invoked when `setTargetType(org.springframework.jms.support.converter.MessageType)` is not `MessageType.TEXT` or `MessageType.BYTES`.

      The default implementation throws an `IllegalArgumentException`.

      Parameters:
        `object` - the object to marshal
        `session` - the JMS Session
        `objectMapper` - the mapper to use
        `targetType` - the target message type (other than TEXT or BYTES)
      Returns:
        the resulting message
      Throws:
        `JMSException` - if thrown by JMS methods
        `IOException` - in case of I/O errors

    - #### setTypeIdOnMessage

          protected void setTypeIdOnMessage(Object object,
                                Message message)
                                     throws JMSException

      Set a type id for the given payload object on the given JMS Message.

      The default implementation consults the configured type id mapping and sets the resulting value (either a mapped id or the raw Java class name) into the configured type id message property.

      Parameters:
        `object` - the payload object to set a type id for
        `message` - the JMS Message to set the type id on
      Throws:
        `JMSException` - if thrown by JMS methods
      See Also:
        `getJavaTypeForMessage(javax.jms.Message)`, `setTypeIdPropertyName(String)`, `setTypeIdMappings(java.util.Map)`

    - #### convertFromTextMessage

          protected Object convertFromTextMessage(TextMessage message,
                                      JavaType targetJavaType)
                                           throws JMSException,
                                                  IOException

      Convert a TextMessage to a Java Object with the specified type.
      Parameters:
        `message` - the input message
        `targetJavaType` - the target type
      Returns:
        the message converted to an object
      Throws:
        `JMSException` - if thrown by JMS
        `IOException` - in case of I/O errors

    - #### convertFromBytesMessage

          protected Object convertFromBytesMessage(BytesMessage message,
                                       JavaType targetJavaType)
                                            throws JMSException,
                                                   IOException

      Convert a BytesMessage to a Java Object with the specified type.
      Parameters:
        `message` - the input message
        `targetJavaType` - the target type
      Returns:
        the message converted to an object
      Throws:
        `JMSException` - if thrown by JMS
        `IOException` - in case of I/O errors

    - #### convertFromMessage

          protected Object convertFromMessage(Message message,
                                  JavaType targetJavaType)
                                       throws JMSException,
                                              IOException

      Template method that allows for custom message mapping. Invoked when `setTargetType(org.springframework.jms.support.converter.MessageType)` is not `MessageType.TEXT` or `MessageType.BYTES`.

      The default implementation throws an `IllegalArgumentException`.

      Parameters:
        `message` - the input message
        `targetJavaType` - the target type
      Returns:
        the message converted to an object
      Throws:
        `JMSException` - if thrown by JMS
        `IOException` - in case of I/O errors

    - #### getJavaTypeForMessage

          protected JavaType getJavaTypeForMessage(Message message)
                                            throws JMSException

      Determine a Jackson JavaType for the given JMS Message, typically parsing a type id message property.

      The default implementation parses the configured type id property name and consults the configured type id mapping. This can be overridden with a different strategy, e.g. doing some heuristics based on message origin.

      Parameters:
        `message` - the JMS Message to set the type id on
      Throws:
        `JMSException` - if thrown by JMS methods
      See Also:
        `setTypeIdOnMessage(Object, javax.jms.Message)`, `setTypeIdPropertyName(String)`, `setTypeIdMappings(java.util.Map)`