Jackson 1.9.0:JsonTypeInfo,用于不使用列表的抽象类

时间:2012-10-26 06:39:57

标签: json spring-mvc jackson

使用这个抽象类:

@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")
@JsonSubTypes({ @JsonSubTypes.Type(value = PostingTaskInstanceDto.class, name = "TI") })
public abstract class BasePostingDto {}

和这个继承的类:

public class PostingTaskInstanceDto extends BasePostingDto {}

我为单个对象获得了正确的序列化。这可以使用Spring-MVC:

@RequestMapping("/{id}")
@ResponseBody
public BasePostingDto findById(@PathVariable("id") Long id) {
    return createDto(postingService.findById(id));
}

但是如果从远程控制器检索BasePostingDto列表,则缺少type属性:

@RequestMapping("/by-user/all")
@ResponseBody
public List<BasePostingDto> findByUser() {
    return createDtoList(postingService.findByUser(AuthUtils.getUser()));
}

为什么这样,我怎么强制类型属性?

更新:如果我将List<BasePostingDto>更改为BasePostingDto[],也会包含type属性,但我更愿意使用List。

1 个答案:

答案 0 :(得分:1)

听起来你正在使用的框架(以及使用Jackson的框架)并没有传递完整的泛型感知类型信息。

我不知道如何修复(这是框架集成的问题,而不是Jackson可以解决的问题),但通常的工作是让你使用List的子类:

public class PostingDtoList extends List<BasePostingDto> { }

并在签名中使用它,而不是泛型类型。这解决了这个问题,因为保留了泛型类型签名(因为它存储在超类型声明中,并且可以通过类型擦除的PostingDtoList类访问!)。

一般来说,我认为最好避免使用通用ListMap类型作为根类型(而是使用POJO);部分是因为发布了问题(例如,使用XML时存在更大的问题)。但如果需要,它可以使用。