使用这个抽象类:
@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。
答案 0 :(得分:1)
听起来你正在使用的框架(以及使用Jackson的框架)并没有传递完整的泛型感知类型信息。
我不知道如何修复(这是框架集成的问题,而不是Jackson可以解决的问题),但通常的工作是让你使用List的子类:
public class PostingDtoList extends List<BasePostingDto> { }
并在签名中使用它,而不是泛型类型。这解决了这个问题,因为保留了泛型类型签名(因为它存储在超类型声明中,并且可以通过类型擦除的PostingDtoList
类访问!)。
一般来说,我认为最好避免使用通用List
和Map
类型作为根类型(而是使用POJO);部分是因为发布了问题(例如,使用XML时存在更大的问题)。但如果需要,它可以使用。