2015-10-14 118 views
3

好吧,我知道有一堆类似的问题,但似乎没有任何工作。杰克逊反序列化与子类

我为我的实体设置了以下结构。

public abstract class MyAbstractClass { 
    // bunch of properties, getters, and setters that subclasses share 

    public abstract String getType(); 
} 

public class MySubclass1 extends MyAbstractClass { 
    // a few unique properties, getters, and setters 

    public String getType() { 
     return "Type_1"; //always the same for each instance of MySubclass1 
    } 
} 

public class MySubclass2 extends MyAbstractClass { 
    // a few unique properties, getters, and setters 

    public String getType() { 
     return "Type_2"; //always the same for each instance of MySubclass2 
    } 
} 

在我的控制器中,我尝试将请求映射到以下方法。

public @RequestBody MyAbstractClass saveObject(@RequestBody MyAbstractClass mac) { 
    // call model to save object 
} 

我想使用1个控制器方法与2个实体的单独控制器方法。但在以下使用上述结果。

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of path.to.my.entity.MyAbstractClass, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information 

有意义。

TRY 1

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="implementingClass") 
public abstract class MyAbstractClass 

我认为它 - 补充说,将存储子类中的元数据implementingClass属性。

结果是什么。

Unexpected token (END_OBJECT), expected FIELD_NAME: missing property 'implementingClass' that is to contain type id (for class path.to.my.entity.MyAbstractClass) 

试图用“阶级”,而不是“implementingClass”为property,得到了类似的结果。

TRY 2

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_OBJECT) 
@JsonSubTypes({ 
    @Type(name="MySubclass1", value=MySubclass1.class), 
    @Type(name="MySubclass2", value=MySubclass2.class) 
}) 
public abstract class MyAbstractClass 

我觉得它 - 使用已定义的name做某种东西包裹的。

结果是什么。甚至

Could not resolve type id 'myUuid' into a subtype of [simple type, class path.to.my.entity.MyAbstractClass] 

相同结果添加时@JsonTypeName("MySubclass1")@JsonTypeName("MySubclass2")到2子类。

其他尝试次数

我尝试了很多。什么都没有将不包括这里的一切。

我觉得应该有一个简单的方法来做到这一点,但我只是不断地配置错误的东西。

我觉得getType可能会被利用,但我不想为类型添加一个实际的属性(它只是一个辅助方法)。另外我想用注释和其他选项来做到这一点。

谢谢。

+0

你可以举一个你要提交给控制器的JSON的例子吗?对于你的'TRY 1',你告诉它在序列化中添加“implementsClass”,并在反序列化中查找“implementsClass”属性,但是你没有指定它。 [另见](http://stackoverflow.com/questions/14222429/jackson-deserializing-nested-polymorphic-type) – xathien

+0

好吧,那么回答的东西。我不想为JSON实现实现类。所以也许尝试1不是我想要做的。 Ty –

+0

所以这可能归结为是否可以利用'getType'。我认为它不能成为一个实际的财产。 –

回答

4

我想通了,但我想我会回答,以防其他人有这个问题。

我添加了一个type属性到我的子类而不是一个辅助方法(下面的一个例子)。

public class MySubclass1 extends MyAbstractClass { 
    @Transient 
    private final String type = "TYPE_1"; 

    public String getType() { 
     return type; 
    } 
} 

然后我为抽象超类做了以下操作。

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="type") 
@JsonSubTypes({ 
    @Type(name="TYPE_1", value=MySubclass1.class), 
    @Type(name="TYPE_2", value=MySubclass2.class) 
}) 
public abstract class MyAbstractClass 

当提供JSON时,我肯定会包含这个类型。我不会把这个包括进去,因为这是怪异的淘汰疯狂。

这不是很好。但它的工作。