2015-01-14 10 views
1

我有一个很大的类集(比100多),它们都是从一些抽象类扩展而来,我们称之为ParentClass。我们可以调用子类ChildAChildB等。我如何为所有孩子注册自定义反序列化器,并在Deserializer内部获得类类型? 我想:杰克森定制解串器模块抽象类

module.addDeserializer(ParentClass.class, new MyObjectDeserializer());

,但它不工作。

我想跳过做什么(什么是工作):

module.addDeserializer(ChildA.class, new MyObjectDeserializer(ChildA.class)); 
module.addDeserializer(ChildB.class, new MyObjectDeserializer(ChildB.class)); 
module.addDeserializer(ChildC.class, new MyObjectDeserializer(ChildC.class)); 
//etc...... 

类的类型应该是已知的,因为我是用杰克逊春天@RequestBody方法,什么都没有定义的类名。 任何想法如何做到这一点?

+0

如果您使用的是同一个父解序器,是否需要注册所有这些子类?也许你应该定义你的控制器函数来接收父类,并以其他方式区分子类。 – hofan41

+0

这不是一个好的解决方案。处理直接类很容易,而是创建一个将它们与抽象区分开来的机制。 (另外,我们在具体类中有很多代码)。 – Tom

+0

我认为这是杰克逊的一个错误。我提出了一个问题:https://github.com/FasterXML/jackson-databind/issues/1784 –

回答

1

据我所知,我不认为杰克逊有一种机制可以解决您的确切需求。

但是,您可以尝试几种方法。 Deserializing polymorphic types with Jackson描述了一个这样的替代方案,但是,您仍然需要明确定义所有支持的子类型。

另一种不需要你显式定义反序列化关系的方法是将你的类继承关系从一个继承变为一个容器。

例如,你的抽象父类转换成一个容器,像这样:

public class DataContainer<T> { 
    String commonString; 
    Integer commonInteger; 

    T subData; 
} 

将允许你只需在您的控制器输入功能定义为

public String controllerFunction(DataContainer<ClassA> classA); 

,而不需要定义所有这些子类反序列化。