Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.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

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
Java 卡夫卡:AvroDeserializer中的ClasscastException_Java_Apache Kafka_Avro - Fatal编程技术网

Java 卡夫卡:AvroDeserializer中的ClasscastException

Java 卡夫卡:AvroDeserializer中的ClasscastException,java,apache-kafka,avro,Java,Apache Kafka,Avro,我使用kafka streams来处理avro消息。因为我将使用来自外部系统的avro消息,所以我为此编写了一个制作人。我已经通过maven avro插件生成了我的模型avro类。 我得到了一个classcast异常(第44行): GenericData$Record无法转换为org.apache.avro.specific.SpecificRecordBase 在我的反序列化程序代码中 public class AvroDeserializer<T extends SpecificR

我使用kafka streams来处理avro消息。因为我将使用来自外部系统的avro消息,所以我为此编写了一个制作人。我已经通过maven avro插件生成了我的模型avro类。 我得到了一个classcast异常(第44行):

GenericData$Record无法转换为org.apache.avro.specific.SpecificRecordBase

在我的反序列化程序代码中

  public class AvroDeserializer<T extends SpecificRecordBase> implements Deserializer<T> {
    private static final Logger LOGGER = LoggerFactory.getLogger(AvroDeserializer.class);
    protected final Class<T> targetType;

    public AvroDeserializer(Class<T> targetType) {
        this.targetType = targetType;
    }

    public void close() {
    }

    public void configure(Map<String, ?> arg0, boolean arg1) {
    }

    public T deserialize(String topic, byte[] data) {
        try {
            T result = null;
            if (data != null) {
                LOGGER.debug("data='{}'", DatatypeConverter.printHexBinary(data));
                DatumReader<T> datumReader = new SpecificDatumReader(((SpecificRecordBase)this.targetType.newInstance()).getSchema());
                Decoder decoder = DecoderFactory.get().binaryDecoder(data, (BinaryDecoder)null);
                result = (T)datumReader.read((T)null, decoder);
                LOGGER.debug("deserialized data='{}'", result);
            }

            return result;
        } catch (Exception var6) {
            throw new SerializationException("Can't deserialize data '" + Arrays.toString(data) + "' from topic '" + topic + "'", var6);
        }
    }
}
公共类AvroDeserializer实现反序列化器{
私有静态最终记录器Logger=LoggerFactory.getLogger(AvroDeserializer.class);
受保护的最终类targetType;
公共AvroDeserializer(目标类型类){
this.targetType=targetType;
}
公众假期结束(){
}
公共void配置(映射arg0、布尔arg1){
}
公共T反序列化(字符串主题,字节[]数据){
试一试{
T结果=null;
如果(数据!=null){
debug(“data='{}',DatatypeConverter.printHexBinary(data));
DatumReader DatumReader=new SpecificDatumReader(((SpecificRecordBase)this.targetType.newInstance()).getSchema());
Decoder Decoder=DecoderFactory.get().binaryDecoder(数据,(binaryDecoder)null);
结果=(T)datumReader.read((T)null,解码器);
debug(“反序列化数据='{}',结果);
}
返回结果;
}捕获(异常var6){
抛出新的SerializationException(“无法反序列化数据””+Arrays.toString(data)+“来自主题””+topic+“”,var6);
}
}
}
对于Producer,我使用此序列化程序:

public class AvroSerializer<T extends SpecificRecordBase> implements Serializer<T> {

  private static final Logger LOGGER = LoggerFactory.getLogger(AvroSerializer.class);

  @Override
  public void close() {
    // No-op
  }

  @Override
  public void configure(Map<String, ?> arg0, boolean arg1) {
    // No-op
  }

  @Override
  public byte[] serialize(String topic, T data) {
    try {
      byte[] result = null;

      if (data != null) {
        LOGGER.debug("data='{}'", data);

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        BinaryEncoder binaryEncoder =
            EncoderFactory.get().binaryEncoder(byteArrayOutputStream, null);

        DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>(data.getSchema());
        datumWriter.write(data, binaryEncoder);

        binaryEncoder.flush();
        byteArrayOutputStream.close();

        result = byteArrayOutputStream.toByteArray();
        LOGGER.debug("serialized data='{}'", DatatypeConverter.printHexBinary(result));
      }
      return result;
    } catch (IOException ex) {
      throw new SerializationException(
          "Can't serialize data='" + data + "' for topic='" + topic + "'", ex);
    }
  }
}
公共类AvroSerializer实现序列化程序{
私有静态最终记录器Logger=LoggerFactory.getLogger(AvroSerializer.class);
@凌驾
公众假期结束(){
//无操作
}
@凌驾
公共void配置(映射arg0、布尔arg1){
//无操作
}
@凌驾
公共字节[]序列化(字符串主题,T数据){
试一试{
字节[]结果=空;
如果(数据!=null){
debug(“data='{}',data);
ByteArrayOutputStream ByteArrayOutputStream=新建ByteArrayOutputStream();
二进制编码器二进制编码器=
EncoderFactory.get().binaryEncoder(byteArrayOutputStream,null);
DatumWriter DatumWriter=新的GenericDatumWriter(data.getSchema());
写入(数据,二进制编码器);
binaryEncoder.flush();
byteArrayOutputStream.close();
结果=byteArrayOutputStream.toByteArray();
debug(“序列化数据='{}',DatatypeConverter.printHexBinary(结果));
}
返回结果;
}捕获(IOEX异常){
抛出新的序列化异常(
对于主题='“+topic+”,ex),无法序列化数据='“+data+”;
}
}
}

我尝试使用其他地方提到的AvroDeserializer,但没有成功。

Confluent现有的Avro序列化程序有什么问题?假设您使用的是架构注册表,您不想要
DatumReader
?然后删除datumReader上的强制转换。read由于一些限制,我无法使用confluent的类,只是在编辑代码时寻求对此代码的修改建议,现在您得到了什么错误?获得相同的classcastexception