gpt4 book ai didi

java - 用于接口(interface)的 Kafka JSON 反序列化器

转载 作者:太空宇宙 更新时间:2023-11-04 09:57:27 25 4
gpt4 key购买 nike

我遇到了类似的问题: Kafka Deserialize Nested Generic Types在我的卡夫卡生产者中,我发送的对象如下所示:

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 接口(interface)实现(大约 10 种不同的)。例如,在这种情况下,我的生产者生成了带有 ConcreteExternalData 对象内部列表的ExternalTO。发送的 JSON 如下所示:

{
"externalDatas":
[{"@class":"com.api.external.to.ConcreteExternalData",
"one":false,
"two":false}]
}

字段@class是因为@JsonTypeInfo注释而添加的,我认为这足以让反序列化器“理解”在反序列化中使用什么类型的IExternalData。不幸的是,在卡夫卡监听器方面,我遇到了异常:

Cannot construct instance of com.api.external.to.IExternalData (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information

消费者看起来类似于:

@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)
}

请帮助通过反序列化解决此问题。

最佳答案

反序列化器不知道在 IExternalData 的所有实现中,它应该将消费者记录数据反序列化到哪个位置。我们必须解决这种模糊性。我能够使用 @JsonDeserialize 注释解决此问题。

@JsonDeserialize(as = <实现>.class

列表声明之上

关于java - 用于接口(interface)的 Kafka JSON 反序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53933296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com