我遇到了类似的问题: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)
}
请帮我解决这个问题。
2条答案
按热度按时间prdp8dxp1#
反序列化程序不知道
IExternalData
,它应该将使用者记录数据反序列化到。我们必须解决这一模棱两可的问题。我可以用@JsonDeserialize
注解。@jsondeserialize(作为=.class
名单上的声明
hwamh0ep2#
我的解决方案是将属性设置为objectmapper。