Kafka JSON 接口反序列化器
Kafka JSON Deserializer for interfaces
我遇到了类似的问题:
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}]
}
字段@class 是由于@JsonTypeInfo 注释而添加的,我认为这足以让反序列化器 "understend" 在反序列化中使用哪种类型的 IExternalData。
不幸的是,在 kafka 监听器方面,我遇到了异常:
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
列表声明上方
我的解决方案是将 属性 设置为 objectMapper。
ObjectMapper mapper = new ObjectMapper();
// deserializes IExternalData into certain implementation.
mapper.enableDefaultTyping();
我遇到了类似的问题: 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}]
}
字段@class 是由于@JsonTypeInfo 注释而添加的,我认为这足以让反序列化器 "understend" 在反序列化中使用哪种类型的 IExternalData。 不幸的是,在 kafka 监听器方面,我遇到了异常:
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
列表声明上方
我的解决方案是将 属性 设置为 objectMapper。
ObjectMapper mapper = new ObjectMapper();
// deserializes IExternalData into certain implementation.
mapper.enableDefaultTyping();