spring-boot - 杰克逊遗产
问题描述
似乎无法弄清楚这一点。我不断收到各种错误,所以我将用我从杰克逊那里得到的当前错误来写这个。
public class ResponseDetail {
private Response response;
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
@JsonSubTypes({
@JsonSubTypes.Type(value = ResponseTypeOne.class, name = "ResponseTypeOne"),
@JsonSubTypes.Type(value = ResponseTypeTwo.class, name = "ResponseTypeTwo"),
@JsonSubTypes.Type(value = ResponseTypeThree.class, name = "ResponseTypeThree")
})
@JsonIgnoreProperties(ignoreUnknown = true)
public abstract class Response {
}
在其他包中,我有这三个:
public class ResponseTypeOne extends Response {
private Integer status;
}
public class ResponseTypeTwo extends Response {
private String message;
}
public class ResponseTypeThree extends Response {
private String value;
}
错误:
Caused by: com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Missing type id when trying to resolve subtype of [simple type, class com.services.models.Response]: missing type id property '@type' (for POJO property 'response')
我已经尝试过各种各样的迭代,@JsonTypeInfo
也includes
没有property
运气Id.CLASS
。
解决方案
您需要声明应如何识别类型。
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "@ttype")
@JsonSubTypes({
@JsonSubTypes.Type(value = ResponseTypeOne.class, name = "ResponseTypeOne"),
@JsonSubTypes.Type(value = ResponseTypeTwo.class, name = "ResponseTypeTwo"),
@JsonSubTypes.Type(value = ResponseTypeThree.class, name = "ResponseTypeThree")
})
@JsonIgnoreProperties(ignoreUnknown = true)
public abstract class Response {
@JsonProperty("@ttype")
public abstract String getChildType();
}
在子类型中,如下所示:
@JsonTypeName("ResponseTypeOne")
public class ResponseTypeOne extends Response {
@Override
public String getChildType() {
return "ResponseTypeOne";
}
}
传入的 json 应该如下所示,以使杰克逊能够找到正确的子实现:
{
//some attributes of child Response
"@ttype": "ResponseTypeOne"
}
推荐阅读
- azure - 如果 Onedrive 不存在于 Azure 中,则在 Onedrive 上创建一个文件
- java - Yaml - 无法为 !Or 构造 java 对象;异常=无效标签
- android - VSCode 颤动的问题
- swift - 快速访问 self.init
- python - 使用列表搜索字符串并返回多字变量。
- windows - BATCH 在子文件夹中查找字符串并移动到新位置
- javascript - 在 Firebase Cloud 函数中返回 XML
- android - 如何在 Android 的列表视图中删除图像周围的额外空间?
- vue.js - Vue 2 过滤器不是一个函数
- amazon-web-services - AWS 是否允许我们使用 SES 为客户预处理电子邮件?