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