Package cn.dinodev.spring.commons.json
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 -
Method Summary
Modifier and TypeMethodDescriptionstatic <T extends Annotation>
voidaddAnnotion(Class<T> annoClass, Function<T, String> idExtractor, String packageToScan) 注册指定注解类型的类扫描器com.fasterxml.jackson.annotation.JsonTypeInfo.IdidFromValue(Object value) 根据对象实例获取类型IDidFromValueAndType(Object value, Class<?> suggestedType) 根据对象实例和建议类型获取类型IDvoidinit(com.fasterxml.jackson.databind.JavaType bt) 初始化类型解析器com.fasterxml.jackson.databind.JavaTypetypeFromId(com.fasterxml.jackson.databind.DatabindContext context, String id) 根据类型标识符获取对应的Java类型。Methods inherited from class com.fasterxml.jackson.databind.jsontype.impl.TypeIdResolverBase
_resolveToParentAsNecessary, getDescForKnownTypeIds, idFromBaseType
-
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:
initin interfacecom.fasterxml.jackson.databind.jsontype.TypeIdResolver- Overrides:
initin classcom.fasterxml.jackson.databind.jsontype.impl.TypeIdResolverBase- Parameters:
bt- 基础Java类型,通常是多态类型的父类或接口
-
idFromValue
根据对象实例获取类型ID- Parameters:
value- 要获取类型ID的对象实例- Returns:
- 对应的类型ID字符串,如果未找到则返回null
-
idFromValueAndType
根据对象实例和建议类型获取类型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:
typeFromIdin interfacecom.fasterxml.jackson.databind.jsontype.TypeIdResolver- Overrides:
typeFromIdin classcom.fasterxml.jackson.databind.jsontype.impl.TypeIdResolverBase- Parameters:
context- 数据绑定上下文id- 类型标识符- Returns:
- 对应的Java类型对象
- Throws:
IOException- 如果IO操作失败IllegalStateException- 如果找不到对应的类型
-
getMechanism
public com.fasterxml.jackson.annotation.JsonTypeInfo.Id getMechanism()
-