用于界面的Kafka JSON反序列化器

时间:2018-12-26 14:20:21

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

我遇到类似的问题: 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类型。 不幸的是,在卡夫卡侦听器方面,我遇到了一个例外:

  

无法构造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)
    }

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

2 个答案:

答案 0 :(得分:0)

IExternalData的所有实现中,反序列化器都不知道应将消费者记录数据反序列化到其中。我们必须解决这种歧义。 我可以使用@JsonDeserialize注解来解决这个问题。

@ JsonDeserialize (as = << em>实施>。class

声明列表上方

答案 1 :(得分:0)

对我来说,解决方案是将属性设置为objectMapper。

\n