Spring boot 发送到Kafka主题时反序列化对象时出错
我是卡夫卡的新手。我正试图向卡夫卡主题发送一条包含标题和有效负载的消息 以下是错误:Spring boot 发送到Kafka主题时反序列化对象时出错,spring-boot,apache-kafka,kafka-topic,Spring Boot,Apache Kafka,Kafka Topic,我是卡夫卡的新手。我正试图向卡夫卡主题发送一条包含标题和有效负载的消息 以下是错误: "org.apache.kafka.common.errors.SerializationException: Can't convert value of class com.cabservice.request.CabLocationPayload to class org.apache.kafka.common.serialization.StringSerializer specified i
"org.apache.kafka.common.errors.SerializationException: Can't convert value of class com.cabservice.request.CabLocationPayload to class org.apache.kafka.common.serialization.StringSerializer specified in value.serializer\nCaused by: java.lang.ClassCastException: class com.cabservice.request.CabLocationPayload cannot be cast to class java.lang.String
有效载荷:
{
“标题”:{
“eventName”:“CAB-LOCATION”,
“事件ID”:“3b1i333kiwoskl”,
“时间戳”:1615205167470
},
“有效载荷”:{
“cabId”:“cc8”,
“driverId”:test@gmail.com",
“地理定位”:{
“id”:“1234”,
“纬度”:78.12,
“经度”:45.23
}
}
}
我有CabLocationPayload,它有字段头和有效载荷
public class CabLocationPayload {
private Header header;
private Payload payload;
//二传手
}
在控制器中
@后期映射(value=“/publish”)
public void sendMessageToKafkaTopic(@RequestBody CabLocationPayload CabLocationPayload){
标头和有效负载具有Json的映射字段
在Producer中更改了VALUE\u SERIALIZER\u CLASS\u CONFIG之后,我能够看到数据。但是仍然无法使用ClassCastException
{公共类卡夫卡配置{
@豆子
public ProducerFactory producerFactoryString(){
Map configProps=new HashMap()
configProps.put(ProducerConfig.BOOTSTRAP\u SERVERS\u CONFIG,“localhost:9092”);
configProps.put(ProducerConfig.KEY\u SERIALIZER\u CLASS\u CONFIG,StringSerializer.CLASS);
configProps.put(ProducerConfig.VALUE\u SERIALIZER\u CLASS\u CONFIG,JsonSerializer.CLASS);
返回新的DefaultKafkaProducerFactory(configProps);
}
@豆子
公共KafkaTemplate kafkaTemplateString(){
返回新的KafkaTemplate(producerFactoryString());
}
@豆子
公共消费者工厂消费者工厂(){
Map configProps=new HashMap();
configProps.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,“localhost:9092”);
configProps.put(ConsumerConfig.GROUP_ID_CONFIG,“GROUP_ID”);
configProps.put(ConsumerConfig.KEY\u反序列化程序\u CLASS\u CONFIG,StringDeserializer.CLASS);
configProps.put(ConsumerConfig.VALUE\u反序列化程序\u类\u配置,JsonDeserializer.CLASS);
返回新的DefaultKafka消费者工厂(configProps);
}
@豆子
公共ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory(){
ConcurrentKafkListenerContainerFactory=新ConcurrentKafkListenerContainerFactory();
setConsumerFactory(consumerFactory());
返回工厂;
}
}}
当前错误为
{2 09:41:20.108 INFO 22561---[ad|producer-1]org.apache.kafka.clients.Metadata:[producer clientId=producer-1]集群ID:lWghv-b|RG-|hO-qOpúcjA
2021-04-22 09:41:20.123错误22561---[nio-9080-exec-2]o.a.c.c.c.[/].[dispatcherServlet]:路径[]上下文中Servlet[dispatcherServlet]的Servlet.service()引发异常[请求处理失败;嵌套异常为org.apache.kafka.common.errors.SerializationException:无法将类com.cabservice.Request.CabLocationPayload的值转换为类org.apache.kafka.common.serialization.StringSerializer(在value.serializer中指定),并带有根本原因]
java.lang.ClassCastException:class com.cabservice.request.CabLocationPayload无法强制转换为class java.lang.String(com.cabservice.request.CabLocationPayload位于加载程序org.springframework.boot.devtools.restart.classloader.RestartClassLoader@1144043d的未命名模块中;java.lang.String位于加载程序“bootstrap”的模块java.base中)
在org.apache.kafka.common.serialization.StringSerializer.serialize(StringSerializer.java:28)~[kafka-clients-2.6.0.jar:na]}
非常感谢您的帮助。Kafka配置'value.serializer'配置应该是序列化程序子类,而不是对象类型 比如说 key:VALUE\u SERIALIZER\u CLASS\u CONFIG,VALUE:JsonSerializer.CLASS(来源:org.springframework.kafka.support.SERIALIZER) 生产者配置示例:
@EnableKafka
@配置
公共类KafkaProducer配置{
@豆子
卡夫卡坦普拉特卡夫卡坦普拉特(){
返回新的卡夫卡模板(producerFactory());
}
@豆子
公共生产工厂生产工厂(){
返回新的DefaultKafkaProducerFactory(getConfig());
}
私有映射getConfig(){
Map config=newhashmap();
config.put(ProducerConfig.BOOTSTRAP_SERVERS_config,“brokers”);
config.put(ProducerConfig.KEY\u SERIALIZER\u CLASS\u config,StringSerializer.CLASS);
config.put(ProducerConfig.VALUE\u SERIALIZER\u CLASS\u config,JsonSerializer.CLASS);
返回配置;
}
}
消费者配置示例:
您必须用希望使用的类名替换您的类。(例如:CabLocationPayload)
import org.apache.kafka.clients.consumer.ConsumerConfig;
导入org.apache.kafka.common.serialization.StringDeserializer;
导入org.springframework.context.annotation.Bean;
导入org.springframework.context.annotation.Configuration;
导入org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
导入org.springframework.kafka.core.DefaultKafkaConsumerFactory;
导入org.springframework.kafka.support.serializer.ErrorHandlingDeserializer;
导入org.springframework.kafka.support.serializer.JsonDeserializer;
导入java.util.HashMap;
导入java.util.Map;
@配置
公共类KafkaConsumerConfiguration{
私有映射用户配置(){
final Map props=new HashMap();
put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,“您的代理”);
props.put(ConsumerConfig.GROUP_ID_CONFIG,“消费者组ID”);
返回道具;
}
@豆子
公共消费工厂kafkaListenerConsumerFactory(){
final ErrorHandlingDeserializer ErrorHandlingDeserializer=新的ErrorHandlingDeserializer(新的JsonDeserializer(YourClass.class,false));
返回新的DefaultKafkanConsumerFactory(this.consumerConfigs(),new StringDeserializer(),errorHandlingDeserializer);
}
@豆子
公共ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory(){
最终ConcurrentKafkListenerContainerFactory工厂=新ConcurrentKafkListenerContainerFactory
configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
return new DefaultKafkaProducerFactory<>(configProps);
}
@Bean
public KafkaTemplate<String, String> kafkaTemplateString() {
return new KafkaTemplate<>(producerFactoryString());
}
@Bean
public ConsumerFactory<String, String> consumerFactory() {
Map<String, Object> configProps = new HashMap<>();
configProps.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
configProps.put(ConsumerConfig.GROUP_ID_CONFIG, "group_id");
configProps.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
configProps.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);
return new DefaultKafkaConsumerFactory<>(configProps);
}
@Bean
public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
return factory;
}