Spring mvc Jackson自定义反序列化器模块到抽象类
我有一大组类(大约100多个),它们都是从某个抽象类扩展而来的,我们称之为Spring mvc Jackson自定义反序列化器模块到抽象类,spring-mvc,jackson,jackson-modules,Spring Mvc,Jackson,Jackson Modules,我有一大组类(大约100多个),它们都是从某个抽象类扩展而来的,我们称之为ParentClass。让我们调用子类ChildA,ChildB,等等。如何为所有子类注册自定义反序列化程序,并在反序列化程序中获取类类型? 我试过: module.addDeserializer(ParentClass.class,新的MyObjectDeserializer()) 但它不起作用 我想跳过做(什么是有效的): 类类型应该是已知的,因为我正在使用Jackson for spring@RequestBody方
ParentClass
。让我们调用子类ChildA
,ChildB
,等等。如何为所有子类注册自定义反序列化程序,并在反序列化程序中获取类类型?
我试过:
module.addDeserializer(ParentClass.class,新的MyObjectDeserializer())代码>
但它不起作用
我想跳过做(什么是有效的):
类类型应该是已知的,因为我正在使用Jackson for spring@RequestBody方法,这里定义了什么样的类名。
你知道怎么做吗?据我所知,我认为杰克逊没有一种机制可以满足你的确切需求
不过,您可以尝试几种选择。
描述一个这样的替代方案,但是,您仍然需要显式定义所有支持的子类型
另一种不需要显式定义反序列化关系的替代方法是将类层次结构从继承层次结构更改为容器层次结构
例如,将抽象父类转换为容器,如下所示:
public class DataContainer<T> {
String commonString;
Integer commonInteger;
T subData;
}
公共类数据容器{
字符串公共字符串;
整数公共整数;
T子数据;
}
允许您在控制器输入函数中简单地定义为
public String controllerFunction(DataContainer<ClassA> classA);
公共字符串控制器函数(DataContainer classA);
无需定义所有这些子类反序列化 如果您使用的是同一个父反序列化程序,是否需要注册所有这些子类?也许你应该定义你的控制器函数来接收父类,并用其他方式区分子类。这不是一个好的解决方案。处理直接类要容易得多,而不是创建一种机制来区分它们和抽象类。(另外,我们在具体的类中有很多代码)。我认为这是杰克逊中的一个bug。我提出了一个问题:
public String controllerFunction(DataContainer<ClassA> classA);