1

使用这个抽象类:

@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()));
}

为什么会这样,我该如何强制 type 属性?

List<BasePostingDto>更新:如果我更改为,则 type 属性也包括在内BasePostingDto[],但是我更愿意使用 List。

4

1 回答 1

2

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

我不知道如何解决(这是框架集成的问题,而不是杰克逊可以解决的问题),但通常的解决方法是让您使用 List 的子类:

public class PostingDtoList extends List<BasePostingDto> { }

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

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

于 2012-10-27T00:06:31.863 回答