Class JsonDeserializer<T>

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

    public class JsonDeserializer<T>
    extends java.lang.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
    • Field Summary

      Fields 
      Modifier and Type Field Description
      static java.lang.String KEY_DEFAULT_TYPE
      Kafka config property for the default key type if no header.
      static java.lang.String KEY_TYPE_METHOD
      A method name to determine the JavaType to deserialize the key to: 'com.Foo.deserialize'.
      protected com.fasterxml.jackson.databind.ObjectMapper objectMapper  
      static java.lang.String REMOVE_TYPE_INFO_HEADERS
      Kafka config property for removing type headers (default true).
      protected com.fasterxml.jackson.databind.JavaType targetType  
      static java.lang.String TRUSTED_PACKAGES
      Kafka config property for trusted deserialization packages.
      static java.lang.String TYPE_MAPPINGS
      Kafka config property to add type mappings to the type mapper: 'foo=com.Foo,bar=com.Bar'.
      protected Jackson2JavaTypeMapper typeMapper  
      static java.lang.String USE_TYPE_INFO_HEADERS
      Kafka config property for using type headers (default true).
      static java.lang.String VALUE_DEFAULT_TYPE
      Kafka config property for the default value type if no header.
      static java.lang.String VALUE_TYPE_METHOD
      A method name to determine the JavaType to deserialize the value to: 'com.Foo.deserialize'.
    • Constructor Summary

      Constructors 
      Constructor Description
      JsonDeserializer()
      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​(java.lang.Class<? super T> targetType)
      Construct an instance with the provided target type, and a default ObjectMapper.
      JsonDeserializer​(java.lang.Class<? super T> targetType, boolean useHeadersIfPresent)
      Construct an instance with the provided target type, and useHeadersIfPresent with a default ObjectMapper.
      JsonDeserializer​(java.lang.Class<? super T> targetType, com.fasterxml.jackson.databind.ObjectMapper objectMapper)
      Construct an instance with the provided target type, and ObjectMapper.
      JsonDeserializer​(java.lang.Class<? super T> targetType, com.fasterxml.jackson.databind.ObjectMapper objectMapper, boolean useHeadersIfPresent)
      Construct an instance with the provided target type, ObjectMapper and useHeadersIfPresent.
    • Constructor Detail

      • 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
                                java.lang.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
                                java.lang.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​(java.lang.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
                                java.lang.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 Detail

      • 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​(java.util.function.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​(java.util.Map<java.lang.String,​?> configs,
                              boolean isKey)
        Specified by:
        configure in interface org.apache.kafka.common.serialization.Deserializer<T>
      • addTrustedPackages

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

        public T deserialize​(java.lang.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​(java.lang.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 java.lang.AutoCloseable
        Specified by:
        close in interface java.io.Closeable
        Specified by:
        close in interface org.apache.kafka.common.serialization.Deserializer<T>
      • copyWithType

        public <X> JsonDeserializer<X> copyWithType​(java.lang.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
      • trustedPackages

        public JsonDeserializer<T> trustedPackages​(java.lang.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​(java.util.function.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