Class JsonDeserializer<T>

java.lang.Object
org.springframework.kafka.support.serializer.JsonDeserializer<T>
Type Parameters:
T - class of the entity, representing messages
All Implemented Interfaces:
Closeable, AutoCloseable, org.apache.kafka.common.serialization.Deserializer<T>

public class JsonDeserializer<T> extends Object implements org.apache.kafka.common.serialization.Deserializer<T>
Generic Deserializer for receiving JSON from Kafka and return Java objects.

IMPORTANT: Configuration must be done completely with property setters or via configure(Map, boolean), not a mixture. If any setters have been called, configure(Map, boolean) will be a no-op.

Author:
Igor Stepanov, Artem Bilan, Gary Russell, Yanming Zhou, Elliot Kennedy, Torsten Schleede, Ivan Ponomarev, Omer Celik
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final String
    Kafka config property for the default key type if no header.
    static final String
    A method name to determine the JavaType to deserialize the key to: 'com.Foo.deserialize'.
    protected final com.fasterxml.jackson.databind.ObjectMapper
     
    static final String
    Kafka config property for removing type headers (default true).
    protected com.fasterxml.jackson.databind.JavaType
     
    static final String
    Kafka config property for trusted deserialization packages.
    static final String
    Kafka config property to add type mappings to the type mapper: 'foo=com.Foo,bar=com.Bar'.
     
    static final String
    Kafka config property for using type headers (default true).
    static final String
    Kafka config property for the default value type if no header.
    static final String
    A method name to determine the JavaType to deserialize the value to: 'com.Foo.deserialize'.
  • Constructor Summary

    Constructors
    Constructor
    Description
    Construct an instance with a default ObjectMapper.
    JsonDeserializer(com.fasterxml.jackson.core.type.TypeReference<? super T> targetType)
    Construct an instance with the provided target type, and a default ObjectMapper.
    JsonDeserializer(com.fasterxml.jackson.core.type.TypeReference<? super T> targetType, boolean useHeadersIfPresent)
    Construct an instance with the provided target type, and useHeadersIfPresent with a default ObjectMapper.
    JsonDeserializer(com.fasterxml.jackson.core.type.TypeReference<? super T> targetType, com.fasterxml.jackson.databind.ObjectMapper objectMapper)
    Construct an instance with the provided target type, and ObjectMapper.
    JsonDeserializer(com.fasterxml.jackson.core.type.TypeReference<? super T> targetType, com.fasterxml.jackson.databind.ObjectMapper objectMapper, boolean useHeadersIfPresent)
    Construct an instance with the provided target type, ObjectMapper and useHeadersIfPresent.
    JsonDeserializer(com.fasterxml.jackson.databind.JavaType targetType)
    Construct an instance with the provided target type, and a default ObjectMapper.
    JsonDeserializer(com.fasterxml.jackson.databind.JavaType targetType, boolean useHeadersIfPresent)
    Construct an instance with the provided target type, and useHeadersIfPresent with a default ObjectMapper.
    JsonDeserializer(com.fasterxml.jackson.databind.JavaType targetType, com.fasterxml.jackson.databind.ObjectMapper objectMapper)
    Construct an instance with the provided target type, and ObjectMapper.
    JsonDeserializer(com.fasterxml.jackson.databind.JavaType targetType, com.fasterxml.jackson.databind.ObjectMapper objectMapper, boolean useHeadersIfPresent)
    Construct an instance with the provided target type, ObjectMapper and useHeadersIfPresent.
    JsonDeserializer(com.fasterxml.jackson.databind.ObjectMapper objectMapper)
    Construct an instance with the provided ObjectMapper.
    JsonDeserializer(Class<? super T> targetType)
    Construct an instance with the provided target type, and a default ObjectMapper.
    JsonDeserializer(Class<? super T> targetType, boolean useHeadersIfPresent)
    Construct an instance with the provided target type, and useHeadersIfPresent with a default ObjectMapper.
    JsonDeserializer(Class<? super T> targetType, com.fasterxml.jackson.databind.ObjectMapper objectMapper)
    Construct an instance with the provided target type, and ObjectMapper.
    JsonDeserializer(Class<? super T> targetType, com.fasterxml.jackson.databind.ObjectMapper objectMapper, boolean useHeadersIfPresent)
    Construct an instance with the provided target type, ObjectMapper and useHeadersIfPresent.
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    Add trusted packages for deserialization.
    void
     
    void
    configure(Map<String,?> configs, boolean isKey)
     
    copyWithType(com.fasterxml.jackson.core.type.TypeReference<? super X> newTargetType)
    Copies this deserializer with same configuration, except new target type reference is used.
    copyWithType(com.fasterxml.jackson.databind.JavaType newTargetType)
    Copies this deserializer with same configuration, except new target java type is used.
    copyWithType(Class<? super X> newTargetType)
    Copies this deserializer with same configuration, except new target type is used.
    deserialize(String topic, byte[] data)
     
    deserialize(String topic, org.apache.kafka.common.header.Headers headers, byte[] data)
     
    Don't remove type information headers.
    Designate this deserializer for deserializing keys (default is values); only applies if the default type mapper is used.
     
    Ignore type information headers and use the configured target class.
    void
    setRemoveTypeHeaders(boolean removeTypeHeaders)
    Set to false to retain type information headers after deserialization.
    void
    setTypeFunction(BiFunction<byte[],org.apache.kafka.common.header.Headers,com.fasterxml.jackson.databind.JavaType> typeFunction)
    Set a BiFunction that receives the data to be deserialized and the headers and returns a JavaType.
    void
    Set a customized type mapper.
    void
    Set a JsonTypeResolver that receives the data to be deserialized and the headers and returns a JavaType.
    void
    setUseTypeHeaders(boolean useTypeHeaders)
    Set to false to ignore type information in headers and use the configured target type instead.
    void
    setUseTypeMapperForKey(boolean isKey)
    Configure the default Jackson2JavaTypeMapper to use key type headers.
    trustedPackages(String... packages)
    Add trusted packages to the default type mapper.
    typeFunction(BiFunction<byte[],org.apache.kafka.common.header.Headers,com.fasterxml.jackson.databind.JavaType> typeFunction)
    Set a BiFunction that receives the data to be deserialized and the headers and returns a JavaType.
    Use the supplied Jackson2JavaTypeMapper.
    Set a JsonTypeResolver that receives the data to be deserialized and the headers and returns a JavaType.

    Methods inherited from class java.lang.Object

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

    Methods inherited from interface org.apache.kafka.common.serialization.Deserializer

    deserialize
  • Field Details

  • Constructor Details

    • JsonDeserializer

      public JsonDeserializer()
      Construct an instance with a default ObjectMapper.
    • JsonDeserializer

      public JsonDeserializer(com.fasterxml.jackson.databind.ObjectMapper objectMapper)
      Construct an instance with the provided ObjectMapper.
      Parameters:
      objectMapper - a custom object mapper.
    • JsonDeserializer

      public JsonDeserializer(@Nullable Class<? super T> targetType)
      Construct an instance with the provided target type, and a default ObjectMapper.
      Parameters:
      targetType - the target type to use if no type info headers are present.
    • JsonDeserializer

      public JsonDeserializer(@Nullable com.fasterxml.jackson.core.type.TypeReference<? super T> targetType)
      Construct an instance with the provided target type, and a default ObjectMapper.
      Parameters:
      targetType - the target type reference to use if no type info headers are present.
      Since:
      2.3
    • JsonDeserializer

      public JsonDeserializer(@Nullable com.fasterxml.jackson.databind.JavaType targetType)
      Construct an instance with the provided target type, and a default ObjectMapper.
      Parameters:
      targetType - the target java type to use if no type info headers are present.
      Since:
      2.3
    • JsonDeserializer

      public JsonDeserializer(@Nullable Class<? super T> targetType, boolean useHeadersIfPresent)
      Construct an instance with the provided target type, and useHeadersIfPresent with a default ObjectMapper.
      Parameters:
      targetType - the target type.
      useHeadersIfPresent - true to use headers if present and fall back to target type if not.
      Since:
      2.2
    • JsonDeserializer

      public JsonDeserializer(com.fasterxml.jackson.core.type.TypeReference<? super T> targetType, boolean useHeadersIfPresent)
      Construct an instance with the provided target type, and useHeadersIfPresent with a default ObjectMapper.
      Parameters:
      targetType - the target type reference.
      useHeadersIfPresent - true to use headers if present and fall back to target type if not.
      Since:
      2.3
    • JsonDeserializer

      public JsonDeserializer(com.fasterxml.jackson.databind.JavaType targetType, boolean useHeadersIfPresent)
      Construct an instance with the provided target type, and useHeadersIfPresent with a default ObjectMapper.
      Parameters:
      targetType - the target java type.
      useHeadersIfPresent - true to use headers if present and fall back to target type if not.
      Since:
      2.3
    • JsonDeserializer

      public JsonDeserializer(Class<? super T> targetType, com.fasterxml.jackson.databind.ObjectMapper objectMapper)
      Construct an instance with the provided target type, and ObjectMapper.
      Parameters:
      targetType - the target type to use if no type info headers are present.
      objectMapper - the mapper. type if not.
    • JsonDeserializer

      public JsonDeserializer(com.fasterxml.jackson.core.type.TypeReference<? super T> targetType, com.fasterxml.jackson.databind.ObjectMapper objectMapper)
      Construct an instance with the provided target type, and ObjectMapper.
      Parameters:
      targetType - the target type reference to use if no type info headers are present.
      objectMapper - the mapper. type if not.
    • JsonDeserializer

      public JsonDeserializer(com.fasterxml.jackson.databind.JavaType targetType, com.fasterxml.jackson.databind.ObjectMapper objectMapper)
      Construct an instance with the provided target type, and ObjectMapper.
      Parameters:
      targetType - the target java type to use if no type info headers are present.
      objectMapper - the mapper. type if not.
    • JsonDeserializer

      public JsonDeserializer(@Nullable Class<? super T> targetType, com.fasterxml.jackson.databind.ObjectMapper objectMapper, boolean useHeadersIfPresent)
      Construct an instance with the provided target type, ObjectMapper and useHeadersIfPresent.
      Parameters:
      targetType - the target type.
      objectMapper - the mapper.
      useHeadersIfPresent - true to use headers if present and fall back to target type if not.
      Since:
      2.2
    • JsonDeserializer

      public JsonDeserializer(com.fasterxml.jackson.core.type.TypeReference<? super T> targetType, com.fasterxml.jackson.databind.ObjectMapper objectMapper, boolean useHeadersIfPresent)
      Construct an instance with the provided target type, ObjectMapper and useHeadersIfPresent.
      Parameters:
      targetType - the target type reference.
      objectMapper - the mapper.
      useHeadersIfPresent - true to use headers if present and fall back to target type if not.
      Since:
      2.3
    • JsonDeserializer

      public JsonDeserializer(@Nullable com.fasterxml.jackson.databind.JavaType targetType, com.fasterxml.jackson.databind.ObjectMapper objectMapper, boolean useHeadersIfPresent)
      Construct an instance with the provided target type, ObjectMapper and useHeadersIfPresent.
      Parameters:
      targetType - the target type reference.
      objectMapper - the mapper.
      useHeadersIfPresent - true to use headers if present and fall back to target type if not.
      Since:
      2.3
  • Method Details

    • getTypeMapper

      public Jackson2JavaTypeMapper getTypeMapper()
    • setTypeMapper

      public void setTypeMapper(Jackson2JavaTypeMapper typeMapper)
      Set a customized type mapper. If the mapper is an AbstractJavaTypeMapper, any class mappings configured in the mapper will be added to the trusted packages.
      Parameters:
      typeMapper - the type mapper.
      Since:
      2.1
    • setUseTypeMapperForKey

      public void setUseTypeMapperForKey(boolean isKey)
      Configure the default Jackson2JavaTypeMapper to use key type headers.
      Parameters:
      isKey - Use key type headers if true
      Since:
      2.1.3
    • setRemoveTypeHeaders

      public void setRemoveTypeHeaders(boolean removeTypeHeaders)
      Set to false to retain type information headers after deserialization. Default true.
      Parameters:
      removeTypeHeaders - true to remove headers.
      Since:
      2.2
    • setUseTypeHeaders

      public void setUseTypeHeaders(boolean useTypeHeaders)
      Set to false to ignore type information in headers and use the configured target type instead. Only applies if the preconfigured type mapper is used. Default true.
      Parameters:
      useTypeHeaders - false to ignore type headers.
      Since:
      2.2.8
    • setTypeFunction

      public void setTypeFunction(BiFunction<byte[],org.apache.kafka.common.header.Headers,com.fasterxml.jackson.databind.JavaType> typeFunction)
      Set a BiFunction that receives the data to be deserialized and the headers and returns a JavaType.
      Parameters:
      typeFunction - the function.
      Since:
      2.5
    • setTypeResolver

      public void setTypeResolver(JsonTypeResolver typeResolver)
      Set a JsonTypeResolver that receives the data to be deserialized and the headers and returns a JavaType.
      Parameters:
      typeResolver - the resolver.
      Since:
      2.5.3
    • configure

      public void configure(Map<String,?> configs, boolean isKey)
      Specified by:
      configure in interface org.apache.kafka.common.serialization.Deserializer<T>
    • addTrustedPackages

      public void addTrustedPackages(String... packages)
      Add trusted packages for deserialization.
      Parameters:
      packages - the packages.
      Since:
      2.1
    • deserialize

      public T deserialize(String topic, org.apache.kafka.common.header.Headers headers, byte[] data)
      Specified by:
      deserialize in interface org.apache.kafka.common.serialization.Deserializer<T>
    • deserialize

      public T deserialize(String topic, @Nullable byte[] data)
      Specified by:
      deserialize in interface org.apache.kafka.common.serialization.Deserializer<T>
    • close

      public void close()
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Specified by:
      close in interface org.apache.kafka.common.serialization.Deserializer<T>
    • copyWithType

      public <X> JsonDeserializer<X> copyWithType(Class<? super X> newTargetType)
      Copies this deserializer with same configuration, except new target type is used.
      Type Parameters:
      X - new deserialization result type
      Parameters:
      newTargetType - type used for when type headers are missing, not null
      Returns:
      new instance of deserializer with type changes
      Since:
      2.6
    • copyWithType

      public <X> JsonDeserializer<X> copyWithType(com.fasterxml.jackson.core.type.TypeReference<? super X> newTargetType)
      Copies this deserializer with same configuration, except new target type reference is used.
      Type Parameters:
      X - new deserialization result type
      Parameters:
      newTargetType - type reference used for when type headers are missing, not null
      Returns:
      new instance of deserializer with type changes
      Since:
      2.6
    • copyWithType

      public <X> JsonDeserializer<X> copyWithType(com.fasterxml.jackson.databind.JavaType newTargetType)
      Copies this deserializer with same configuration, except new target java type is used.
      Type Parameters:
      X - new deserialization result type
      Parameters:
      newTargetType - java type used for when type headers are missing, not null
      Returns:
      new instance of deserializer with type changes
      Since:
      2.6
    • forKeys

      public JsonDeserializer<T> forKeys()
      Designate this deserializer for deserializing keys (default is values); only applies if the default type mapper is used.
      Returns:
      the deserializer.
      Since:
      2.3
    • dontRemoveTypeHeaders

      public JsonDeserializer<T> dontRemoveTypeHeaders()
      Don't remove type information headers.
      Returns:
      the deserializer.
      Since:
      2.3
      See Also:
    • ignoreTypeHeaders

      public JsonDeserializer<T> ignoreTypeHeaders()
      Ignore type information headers and use the configured target class.
      Returns:
      the deserializer.
      Since:
      2.3
      See Also:
    • typeMapper

      public JsonDeserializer<T> typeMapper(Jackson2JavaTypeMapper mapper)
      Use the supplied Jackson2JavaTypeMapper.
      Parameters:
      mapper - the mapper.
      Returns:
      the deserializer.
      Since:
      2.3
      See Also:
    • trustedPackages

      public JsonDeserializer<T> trustedPackages(String... packages)
      Add trusted packages to the default type mapper.
      Parameters:
      packages - the packages.
      Returns:
      the deserializer.
      Since:
      2,5
    • typeFunction

      public JsonDeserializer<T> typeFunction(BiFunction<byte[],org.apache.kafka.common.header.Headers,com.fasterxml.jackson.databind.JavaType> typeFunction)
      Set a BiFunction that receives the data to be deserialized and the headers and returns a JavaType.
      Parameters:
      typeFunction - the function.
      Returns:
      the deserializer.
      Since:
      2.5
    • typeResolver

      public JsonDeserializer<T> typeResolver(JsonTypeResolver resolver)
      Set a JsonTypeResolver that receives the data to be deserialized and the headers and returns a JavaType.
      Parameters:
      resolver - the resolver.
      Returns:
      the deserializer.
      Since:
      2.5.3