2012-10-26 95 views
1

使用這種抽象類的工作:傑克遜1.9.0:JsonTypeInfo爲抽象類不使用列表

@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[],也包含類型屬性,但是我寧願使用列表。

+0

+1爲數組提示:) – Boaz

回答

1

聽起來像你正在使用的框架(以及其中使用Jackson的框架)沒有傳遞完整的泛型感知類型信息。

我不知道如何可以是固定的(這是由框架集成,而不是傑克遜可以解決問題),但通常的解決辦法是讓你使用子類列表:

public class PostingDtoList extends List<BasePostingDto> { } 

並將其用於簽名而不是泛型類型。這解決了這個問題,因爲保留了泛型類型簽名(因爲它存儲在超類型聲明中,並且可以通過類型擦除PostingDtoList類來訪問!)。

在一般情況下,我認爲最好避免使用通用的ListMap類型作爲根類型(而不是使用POJO);部分原因是由於發佈的問題(例如使用XML時存在更大的問題)。但是如果需要的話,它可以工作。

+0

我使用的集成框架是spring-mvc。你的'PostingDtoList'大多可能會起作用,但我寧願返回一個數組而不是引入一個新的DTO類。 – Konsumierer

+1

仔細閱讀一行代碼,你看到的只是一個List,而不是一個新的DTO類。但是它對數據綁定器有所不同,因爲這將返回通用類型信息。 另一種可能性是使用Java數組 - 與List不同,它們保留元素類型信息!這往往是被忽視的事情;數組不是通用的,但它們(更)是類型安全的。 – StaxMan