Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 发送到Kafka主题时反序列化对象时出错_Spring Boot_Apache Kafka_Kafka Topic - Fatal编程技术网

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;
}