Class AnnotionedJsonTypeIdResolver

java.lang.Object
com.fasterxml.jackson.databind.jsontype.impl.TypeIdResolverBase
cn.dinodev.spring.commons.json.AnnotionedJsonTypeIdResolver
All Implemented Interfaces:
com.fasterxml.jackson.databind.jsontype.TypeIdResolver

public class AnnotionedJsonTypeIdResolver extends com.fasterxml.jackson.databind.jsontype.impl.TypeIdResolverBase
基于注解的JSON类型ID解析器,用于多态类型的序列化和反序列化

该解析器通过扫描指定包下的类,查找带有特定注解的类, 并建立类型ID与类之间的映射关系,用于Jackson的多态类型处理。

主要功能:

  • 扫描包路径下的所有类文件
  • 识别带有指定注解的类
  • 提取注解中的类型ID信息
  • 建立双向映射关系(类型ID ↔ 类)
  • 支持Jackson的多态序列化/反序列化

使用场景: 当需要对继承体系中的多个子类进行JSON序列化时, 可以使用此解析器根据注解自动识别类型, 避免手动配置每个子类的类型信息。

线程安全: 该类使用ConcurrentHashMap来确保在多线程环境下的线程安全性。

Author:
Cody Lu
  • Field Summary

    Fields inherited from class com.fasterxml.jackson.databind.jsontype.impl.TypeIdResolverBase

    _baseType, _typeFactory
  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    static <T extends Annotation>
    void
    addAnnotion(Class<T> annoClass, Function<T,String> idExtractor, String packageToScan)
    注册指定注解类型的类扫描器
    com.fasterxml.jackson.annotation.JsonTypeInfo.Id
     
    根据对象实例获取类型ID
    idFromValueAndType(Object value, Class<?> suggestedType)
    根据对象实例和建议类型获取类型ID
    void
    init(com.fasterxml.jackson.databind.JavaType bt)
    初始化类型解析器
    com.fasterxml.jackson.databind.JavaType
    typeFromId(com.fasterxml.jackson.databind.DatabindContext context, String id)
    根据类型标识符获取对应的Java类型。

    Methods inherited from class com.fasterxml.jackson.databind.jsontype.impl.TypeIdResolverBase

    _resolveToParentAsNecessary, getDescForKnownTypeIds, idFromBaseType

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • AnnotionedJsonTypeIdResolver

      public AnnotionedJsonTypeIdResolver()
  • Method Details

    • addAnnotion

      public static <T extends Annotation> void addAnnotion(Class<T> annoClass, Function<T,String> idExtractor, @Nonnull String packageToScan) throws IOException
      注册指定注解类型的类扫描器

      扫描指定包路径下的所有类,查找带有指定注解的类, 并使用提供的ID提取器从注解中提取类型ID, 将类与类型ID的映射关系缓存起来。

      Type Parameters:
      T - 注解类型
      Parameters:
      annoClass - 要查找的注解类
      idExtractor - 从注解中提取类型ID的函数
      packageToScan - 要扫描的包路径(如:com.example.model)
      Throws:
      IOException - 如果读取类文件时发生IO错误
    • init

      public void init(com.fasterxml.jackson.databind.JavaType bt)
      初始化类型解析器

      根据指定的基础类型,从注解缓存中筛选出相关的子类, 建立类型ID与类之间的双向映射关系。

      Specified by:
      init in interface com.fasterxml.jackson.databind.jsontype.TypeIdResolver
      Overrides:
      init in class com.fasterxml.jackson.databind.jsontype.impl.TypeIdResolverBase
      Parameters:
      bt - 基础Java类型,通常是多态类型的父类或接口
    • idFromValue

      public String idFromValue(Object value)
      根据对象实例获取类型ID
      Parameters:
      value - 要获取类型ID的对象实例
      Returns:
      对应的类型ID字符串,如果未找到则返回null
    • idFromValueAndType

      public String idFromValueAndType(Object value, Class<?> suggestedType)
      根据对象实例和建议类型获取类型ID

      该方法忽略建议类型,直接使用对象的实际类型。

      Parameters:
      value - 要获取类型ID的对象实例
      suggestedType - 建议的类型(被忽略)
      Returns:
      对应的类型ID字符串
    • typeFromId

      public com.fasterxml.jackson.databind.JavaType typeFromId(com.fasterxml.jackson.databind.DatabindContext context, String id) throws IOException
      根据类型标识符获取对应的Java类型。

      该方法通过传入的类型ID在类型映射表中查找对应的Java类型。 如果找不到对应的类型,会抛出IllegalStateException异常。

      Specified by:
      typeFromId in interface com.fasterxml.jackson.databind.jsontype.TypeIdResolver
      Overrides:
      typeFromId in class com.fasterxml.jackson.databind.jsontype.impl.TypeIdResolverBase
      Parameters:
      context - 数据绑定上下文
      id - 类型标识符
      Returns:
      对应的Java类型对象
      Throws:
      IOException - 如果IO操作失败
      IllegalStateException - 如果找不到对应的类型
    • getMechanism

      public com.fasterxml.jackson.annotation.JsonTypeInfo.Id getMechanism()