I am sending `List<Object>` from Kafka Producer to a topic. A consumer which listens to the topic receives the message but in a different format(i.e. `List<LinkedHashMap>` instead of `List<Object>`)
Any idea on how to receive the List<Object> messages in the consumer?I am sending `List<foo>`. But in the Consumer, data comes as `List<LinkedHashMap>`
只是把下面的例子改成列表https://memorynotfound.com/spring-kafka-json-serializer-deserializer-example/ 从链接中可以找到发送者和侦听者。唯一的变化是发送方将接受object而不是foo。
public class SpringKafkaApplication implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(SpringKafkaApplication.class, args);
}
@Autowired
private FooSender sender;
@Override
public void run(String... strings) throws Exception {
List<Foo> f = new ArrayList<>();
f.add(new Foo("Spring Kafka", "sending and receiving JSON messages"))
f.add(new Foo("Spring Kafka1", "sending and receiving11"))
sender.send(f);
}
}
1条答案
按热度按时间46qrfjad1#
不要在注解中添加代码;很难阅读-改为编辑问题。
你用的是什么版本的SpringKafka?
您至少需要2.1.x和一个kafka代理>=0.11,这样类型信息就可以在头中传递。看这里。
对于早期版本,必须使用目标类型配置反序列化程序。
编辑
我看到了问题;由于类型擦除,序列化程序不知道容器(列表)的内容类型,因此它不会尝试内省集合以查找类型。
虽然我们可能可以解决像集合这样的简单情况,但更复杂的对象(例如Map的Map)将是一个挑战。
一个数组,而不是一个列表,可能会起作用。
同时,您可以使用消息转换器,在这里我们使用侦听器的参数类型来确定预期的类型。举个例子:
和
以及
或者,可以对序列化程序进行子类化,以设置具有适当类型的头,从而帮助反序列化程序。