kafkajson接口反序列化程序

csga3l58  于 2021-06-07  发布在  Kafka
关注(0)|答案(2)|浏览(395)

我遇到了类似的问题:kafka反序列化我的kafka producer中的嵌套泛型类型我发送的对象如下所示:

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注解而添加的,我认为这足以让反序列化程序“理解”反序列化中要使用的iexternaldata类型。不幸的是,对于Kafka听众来说,我得到了一个例外:
无法构造的示例 com.api.external.to.IExternalData (不存在像default construct那样的创建者):抽象类型要么需要Map到具体类型,要么具有自定义反序列化程序,要么包含其他类型信息
消费者看起来类似于:

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

请帮我解决这个问题。

prdp8dxp

prdp8dxp1#

反序列化程序不知道 IExternalData ,它应该将使用者记录数据反序列化到。我们必须解决这一模棱两可的问题。我可以用 @JsonDeserialize 注解。
@jsondeserialize(作为=.class
名单上的声明

hwamh0ep

hwamh0ep2#

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

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

相关问题