Java 如何在kafka producer中切换到自定义编码器?

Java 如何在kafka producer中切换到自定义编码器?,java,apache-kafka,Java,Apache Kafka,当我尝试在卡夫卡主题中使用字符串作为键时,出现以下错误 18/05/14 17:08:26 ERROR async.DefaultEventHandler: Error serializing message for topic my_topic java.lang.ClassCastException: java.lang.String cannot be cast to [B at kafka.serializer.DefaultEncoder.toBytes(Encoder.sca

当我尝试在卡夫卡主题中使用字符串作为键时,出现以下错误

18/05/14 17:08:26 ERROR async.DefaultEventHandler: Error serializing message for topic my_topic
java.lang.ClassCastException: java.lang.String cannot be cast to [B
    at kafka.serializer.DefaultEncoder.toBytes(Encoder.scala:34)
    at kafka.producer.async.DefaultEventHandler$$anonfun$serialize$1.apply(DefaultEventHandler.scala:130)
    at kafka.producer.async.DefaultEventHandler$$anonfun$serialize$1.apply(DefaultEventHandler.scala:127)
    at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
    at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:47)
    at kafka.producer.async.DefaultEventHandler.serialize(DefaultEventHandler.scala:127)
    at kafka.producer.async.DefaultEventHandler.handle(DefaultEventHandler.scala:53)
    at kafka.producer.async.ProducerSendThread.tryToHandle(ProducerSendThread.scala:105)
    at kafka.producer.async.ProducerSendThread$$anonfun$processEvents$3.apply(ProducerSendThread.scala:88)
    at kafka.producer.async.ProducerSendThread$$anonfun$processEvents$3.apply(ProducerSendThread.scala:68)
    at scala.collection.immutable.Stream.foreach(Stream.scala:547)
    at kafka.producer.async.ProducerSendThread.processEvents(ProducerSendThread.scala:67)
    at kafka.producer.async.ProducerSendThread.run(ProducerSendThread.scala:45)
似乎问题在于默认编码器

public class DefaultEncoder implements Encoder<byte[]> 
向生产商提供定制编码器的正确方式是什么


我是否也必须在使用者端进行更改?

在生产者/使用者上,您可以指定不同的序列化程序,而不是默认的ByteArraySerializer,您可以找到版本
1.1.0
的可用序列化程序,也可以指定自己的序列化程序

通常,如果您正在发送/接收字符串或Json,您可以使用默认的
org.apache.kafka.common.serialization.StringSerializer
org.apache.kafka.common.serialization.StringDeserializer
。对于生产者/消费者而言,属性为:

private void configureProducer() {
    Properties props = new Properties();
    props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
}

private void configureConsumer() {
    Properties props = new Properties();
    props.put("key.serializer", "org.apache.kafka.common.serialization.StringDeserializer");
    props.put("value.serializer", "org.apache.kafka.common.serialization.StringDeserializer");
}

Properties producerProps = configureProducer();
KafkaProducer<String, String> producer = new KafkaProducer<>(producerProps);
Properties consumerProps = configureConsumer();
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(consumerProps);
private void configureProducer(){
Properties props=新属性();
put(“key.serializer”、“org.apache.kafka.common.serialization.StringSerializer”);
put(“value.serializer”、“org.apache.kafka.common.serialization.StringSerializer”);
}
私有void configureConsumer(){
Properties props=新属性();
put(“key.serializer”、“org.apache.kafka.common.serialization.StringDeserializer”);
put(“value.serializer”、“org.apache.kafka.common.serialization.StringDeserializer”);
}
Properties producerProps=configureProducer();
卡夫卡制作人=新卡夫卡制作人(producerProps);
属性consumerProps=configureConsumer();
卡夫卡消费者=新卡夫卡消费者(消费者行动);

如果您想发送自己的自定义bean,那么可以将其转换为json并使用默认的StringSerializer/反序列化器,或者构建自己的序列化/反序列化类。您可以看到一个使用带有spring boot的json字符串的示例

您的代码的哪一部分试图获取字符串?是的,生产者和消费者必须就主题数据格式达成一致。此外,ByteArraySerializer已经存在
private void configureProducer() {
    Properties props = new Properties();
    props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
}

private void configureConsumer() {
    Properties props = new Properties();
    props.put("key.serializer", "org.apache.kafka.common.serialization.StringDeserializer");
    props.put("value.serializer", "org.apache.kafka.common.serialization.StringDeserializer");
}

Properties producerProps = configureProducer();
KafkaProducer<String, String> producer = new KafkaProducer<>(producerProps);
Properties consumerProps = configureConsumer();
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(consumerProps);