在 Avro IDL 中,我有一条消息记录,定义如下:
record Message{
MessageId id;
array<string> dataField;
}
我在另一个具有空联合的记录中使用此记录:
record Invoice{
...
union {null,array<Message>} message;
}
我们有一个使用 1.10.2 版本的 Java Kafka 消费者(我们正在使用 Confluent 平台)avro-maven-plugin
,配置为<stringType>String</stringType>
当我们拨打这样的电话时:
List<String> msgList = message.getDataField();
for (String msg : msgList) {...}
我们在第二行收到以下错误:class org.apache.avro.util.Utf8 cannot be cast to class java.lang.String
以前,Invoice 对象被定义为:
record Invoice{
...
array<Message> message;
}
我们没有收到这个错误。我们发现在我们的模式文件中,从
"name" : "dataField",
"type" : {
"type" : "array",
"items" : "string"
}
至
"name" : "dataField",
"type" : {
"type" : "array",
"items" :{
"type": "string",
"avro.java.string" : "String"
}
}
纠正问题。
我不清楚为什么添加工会会导致这种行为变化。我是否应该使用 声明架构中的所有字符串,avro.java.string
如果是,我该如何使用 Avro IDL 来做到这一点?