java-忽略RuntimeTypeAdapterFactory中未注册的子类型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-忽略RuntimeTypeAdapterFactory中未注册的子类型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2139字,纯文字阅读大概需要4分钟。
内容图文
![java-忽略RuntimeTypeAdapterFactory中未注册的子类型](/upload/InfoBanner/zyjiaocheng/686/b84085ff9d48484cb00817aff5e1dc24.jpg)
我们有一个将GSON用作转换器的Retrofit API,它要求将卡片列表显示给用户.卡遵循以下格式:
[
{
"cardType": "user",
"data": {}
},
{
"cardType": "content",
"data": {}
}
]
卡之间的数据属性不同,因此要解决此问题,我们使用GSON的RuntimeTypeAdapterFactory:
final RuntimeTypeAdapterFactory<Card> factory = RuntimeTypeAdapterFactory
.of(Card.class, "cardType")
.registerSubtype(UserCard.class, "user")
...
.registerSubtype(ContentCard.class, "content");
但是,我们发现,如果将API更新为包含我们不期望的新cardType,则此操作将无提示地反序列化.默默地说,response.isSuccessful()仍返回true,但response.body()为null.我们能够确定新卡类型的唯一方法是通过反复试验来解决问题.
有什么方法可以让GSON忽略我们尚未注册的任何cardType?如果我们尝试添加此新卡,但应用程序不支持该卡,则我想忽略它.
解决方法:
我认为问题是由于以下事实造成的:RuntimeTypeAdapterFactory在尝试为未注册的类型名称创建适配器时将引发异常(请参见RuntimeTypeAdapterFactorys源代码的摘录):
public <R> TypeAdapter<R> create(Gson gson, TypeToken<R> type) {
...
// typeFieldName is the type name that is given when registering the sub type
if (jsonObject.has(typeFieldName)) {
throw new JsonParseException("cannot serialize " + srcType.getName()
+ " because it already defines a field named " + typeFieldName);
}
...
}
这可能导致Retrofit将整个响应截断为null.
然后查看TypeAdapterFactory的声明:
public interface TypeAdapterFactory {
/**
* Returns a type adapter for {@code type}, or null if this factory doesn't
* support {@code type}.
*/
<T> TypeAdapter<T> create(Gson gson, TypeToken<T> type);
}
如果您能够返回null而不是抛出该异常,那么我猜Retrofit可以返回它识别的所有子类.
通过扩展RuntimeTypeAdapterFactory并覆盖有问题的方法将很容易处理,但是不幸的是,类被声明为final.
因此,您可以创建一个包装类型的适配器,在其中调用原始的RuntimeTypeAdapter,或者像我那样,只需将类RuntimeTypeAdapterFactory的源复制到您自己的某个包中,并根据需要进行编辑.它是开源的.因此,有问题的部分将是:
if (jsonObject.has(typeFieldName)) {
log.warn("cannot serialize " + srcType.getName()
+ " because it already defines a field named " + typeFieldName);
return null;
}
为了澄清,因为您现在返回的是null而不是抛出异常,所以列表将包含此null元素.要真正忽略它,请确保在实现时调用list.filterNotNull().
内容总结
以上是互联网集市为您收集整理的java-忽略RuntimeTypeAdapterFactory中未注册的子类型全部内容,希望文章能够帮你解决java-忽略RuntimeTypeAdapterFactory中未注册的子类型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。