我正在使用Java8。我尝试在jackson中使用多态性。我有三节课,如下所示。
class AbstractDetails{
}
@Data
@NoArgsConstructor
@SuperBuilder(toBuilder = true)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
property = "type",
visible = true,
include = JsonTypeInfo.As.EXISTING_PROPERTY)
@JsonSubTypes({
@JsonSubTypes.Type(value = AccountDto.class, name = "EXPENSE"),
@JsonSubTypes.Type(value = AccountTransferDto.class, name = "TRANSFER")
})
class AccountDto extends AbstractDetails{
private String type;
}
class AccountTransferDto extends AccountDto{
// some additional fields than AccountDto
}
根据类型,我很容易得到 AccountDto
或 AccountTransferDto
. AccountTransferDto
具有比 AccountDto
. 这个场景运行良好。
现在我有了一个新的需求,我需要添加一些基于 userType
在会计方面。因为我不能扩展另一个类,所以我计划在不影响现有类的情况下迁移到接口,如下所示
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
property = "accountUser",
visible = true,
include = JsonTypeInfo.As.EXISTING_PROPERTY)
@JsonSubTypes({
@JsonSubTypes.Type(value = ExistingAccountUser.class, name = "NEW"),
@JsonSubTypes.Type(value = NewAccountUser.class, name = "EXISTING")
})
public interface AccountUser {
AccountUserType accountUserType();
}
public class ExistingAccountUser implements AccountUser{
private String regId;
@Override
public AccountUserType accountUserType() {
return AccountUserType.EXISTING;
}
}
public class NewAccountUser implements AccountUser{
private String name;
private String phone;
@Override
public AccountUserType accountUserType() {
return AccountUserType.NEW;
}
}
然后我计划在 AccountDto
像下面这样。
class AccountDto extends AbstractDetails{
// Existing fields
AccountUser accountUser;
}
但我总是能得到 missing type id property 'accountUser' (for POJO property 'accountUser')\n at [Source: (PushbackInputStream); line: 19, column: 19]
.
我真的很困惑,我试过了
// Annotations removed for easiness
public class AccountDto extends AbstractDetailDto implements AccountUser {
@Override
public AccountUserType accountUserType() {
return accountUser.accountUserType();
}
}
还是我做的方式错了?我有什么办法可以有效地做吗?请给我一些建议,使这项工作。提前谢谢。
暂无答案!
目前还没有任何答案,快来回答吧!