java中类和接口中的jsontypeinfo

z9smfwbn  于 2021-08-25  发布在  Java
关注(0)|答案(0)|浏览(209)

我正在使用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
}

根据类型,我很容易得到 AccountDtoAccountTransferDto . 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();
  }
}

还是我做的方式错了?我有什么办法可以有效地做吗?请给我一些建议,使这项工作。提前谢谢。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题