Jackson: JsonTypeInfo未添加属性

3

我正在尝试使用Jackson来序列化具有多态性的实体。序列化的JSON字符串应该包括一个额外的"type"属性,其值为"groupA"或"groupB",但它没有出现。

我的实体看起来像这样:

@Entity
@Table(name = "\"group\"")
@Inheritance(strategy = InheritanceType.JOINED)
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = GroupA.class, name = "groupA"),
    @JsonSubTypes.Type(value = GroupB.class, name = "groupB")
})
@JsonSerialize(include = JsonSerialize.Inclusion.ALWAYS)
public class Group implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    // ...
}



@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSerialize(include = JsonSerialize.Inclusion.ALWAYS)
public class GroupA extends Group {
    //...
}



@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSerialize(include = JsonSerialize.Inclusion.ALWAYS)
public class GroupB extends Group {
    // ...
}

您知道为什么序列化程序不添加 type 属性吗?

3个回答

8
问题出在控制器的操作中:
@RequestMapping(...)
@ResponseBody
public Map<String, Object> getGroups() {
    Map<String, Object> response = new HashMap<String, Object>();
    List<Group> groups = magicallyRetrieveGroupsFromNarnia();
    response.put("groups", groups);
    response.put("status", Status.OK);
    return response;
}

它返回了一个字符串-对象元组的映射。 MappingJackson2HttpMessageConverter将此映射传递给ObjectMapper。 ObjectMapper不关心提供的映射内容中的@JsonTypeInfo,因为它不知道它。它看到的只是穿着不舒服的Object-suits的类型擦除列表实例。
解决此问题的方法有多种:
- 使用Map。
缺点:无法混合类型(int、string、复杂对象、列表等)。 优点:非常简单。
- 创建一个显式的GroupList。
缺点:更加凌乱。 优点:可与Map一起使用。
- 创建具有显式字段的复杂对象。
缺点:更加凌乱。 优点:可与Map一起使用。
- 使用自定义MappingJackson2HttpMessageConverter扩展中的类型编写器。
缺点:相当复杂。 优点:非常灵活。
这个JIRA问题帮助我理解了这个问题:https://github.com/FasterXML/jackson-databind/issues/364

1

由于相关类没有“type”属性,您可能需要在此处指定EXTERNAL_PROPERTY。


0
也许你需要在Group类中加入一个"type"字段?像这样:private String type; 当然需要有对应的getter和setter方法。

1
不,Jackson的JsonTypeInfo注释不是这样工作的。 - Alexander Müller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接