java - 用于接口的 Kafka JSON 反序列化器
问题描述
我遇到了类似的问题: Kafka Deserialize Nested Generic Types 在我的 kafka 生产者中,我正在发送如下所示的对象:
public class ExternalTO implements Serializable
{
private static final long serialVersionUID = 7949808917892350503L;
private List<IExternalData> externalDatas;
public ExternalTO()
{}
}
基石是这样的:List<IExternalData> externalDatas
。
这个界面看起来像:
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
public interface IExternalData
{
String getOne();
}
在我的应用程序中,可以生成多种类型的 IExternalBetData 接口实现(大约 10 种不同)。例如,在这种情况下,我的生产者生成了带有 ConcreteExternalData 对象内部列表的 ExternalTO。发送的 JSON 如下所示:
{
"externalDatas":
[{"@class":"com.api.external.to.ConcreteExternalData",
"one":false,
"two":false}]
}
由于@JsonTypeInfo 注释而添加了字段@class,我认为这足以让反序列化器“了解”在反序列化中使用哪种类型的IExternalData。不幸的是,在 kafka 监听器方面,我遇到了异常:
无法构造实例
com.api.external.to.IExternalData
(没有创建者,如默认构造,存在):抽象类型要么需要映射到具体类型,要么具有自定义反序列化器,要么包含额外的类型信息
消费者看起来类似于:
@Service
public class Consumer
{
private final ObjectMapper objectMapper;
public Consumer(ObjectMapper objectMapper)
{
this.objectMapper = objectMapper;
}
@KafkaListener(topics = {"${kafka.topic}"})
public void listen(ConsumerRecord<String, String> record)
{
objectMapper.readValue(record.value(), ExternalTO.class)
}
请帮助通过反序列化解决此问题。
解决方案
我的解决方案是将属性设置为 objectMapper。
ObjectMapper mapper = new ObjectMapper();
// deserializes IExternalData into certain implementation.
mapper.enableDefaultTyping();
推荐阅读
- wordpress - WooCommerce 计划的操作选项卡
- vue.js - 使用 Vue-CLI 创建的应用程序提供 404 页面
- node.js - NodeJS - 多线程应用程序数据库瓶颈
- c - 如何找到堆栈在C中的结束位置
- pandas - 使用 agg 重新采样不同的行为并调用函数
- c++ - C++ on Vistual Studio with CMake error: manifest 'build.ninja' still dirty after 100 tries
- android - 带有 MVVM 的 RxJava:带有 setValue() 的 MutableLiveData 与 LiveDataReactiveStreams
- android - React Native - Unexpected Identifier 'str' with fresh project
- java - How do I make this image larger?
- mysql - 有没有办法让mysql在获取时自动转换时区?