【问题标题】:Kafka JSON Deserializer for interfaces用于接口的 Kafka JSON 反序列化器
【发布时间】:2019-05-24 18:56:57
【问题描述】:

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

public class ExternalTO implements Serializable
{
    private static final long serialVersionUID = 7949808917892350503L;
    private List<IExternalData> externalDatas;

    public ExternalTO()
    {}
}

基石是这样的:List&lt;IExternalData&gt; 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)
    }

请帮助解决这个反序列化问题。

【问题讨论】:

    标签: java json apache-kafka jackson json-deserialization


    【解决方案1】:

    我的解决方案是将属性设置为 objectMapper。

    ObjectMapper mapper = new ObjectMapper();
    // deserializes IExternalData into certain implementation.
    mapper.enableDefaultTyping();
    

    【讨论】:

      【解决方案2】:

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

      @JsonDeserialize(as = 实现>.class

      在列表的声明之上

      【讨论】:

        猜你喜欢
        • 2021-10-21
        • 2019-06-11
        • 1970-01-01
        • 2020-08-17
        • 1970-01-01
        • 1970-01-01
        • 2020-09-20
        • 1970-01-01
        • 2021-08-29
        相关资源
        最近更新 更多