提问人:mgerbracht 提问时间:11/14/2022 最后编辑:OneCricketeermgerbracht 更新时间:11/14/2022 访问量:909
如何处理没有命名空间的 avro 架构
How to handle avro schema without namespace
问:
我想使用avro模式中自动生成的java类来使用kafka消息。不幸的是,avro 架构没有定义命名空间(架构的所有者对添加命名空间有点犹豫)。
如果我使用 avro maven 插件生成类,它们最终会进入根包。因此,我似乎无法在我的 java 类中导入和使用它们。
那么问题是如何处理没有命名空间的 avro 模式?
我有以下想法:
- 在生成类时配置默认命名空间。但我找不到配置选项。我想它会在 pom 文件的 avro maven 插件中,但似乎没有选项。
- 自行向 avro 架构添加一个“random”命名空间。这样一来,java 方面一切都很好 - 生成了类,我可以使用它们,但 Kafka 消费者显示一个错误(见下文),我猜(!)与我的无效命名空间有关
- 在根包中生成类并使用反射将它们放在类路径上 - 但这是一个好主意吗?
- 我发现了类似的功能请求 (https://github.com/davidmc24/gradle-avro-plugin/issues/81) - 但我不明白那里提到的解决方法。
尝试案例 2(我自己添加的命名空间)时收到的错误消息:
org.apache.kafka.common.errors.SerializationException:在查找 SpecificRecord 的读取器架构时,找不到编写器架构中指定的类 MyClass。
答:
1赞
OneCricketeer
11/14/2022
#1
该问题中的解决方法是将原始 AVSC 文件读取为 JSON,并在记录中添加命名空间(如果不存在),这是您已经建议的。
正如你所发现的,如果不做这样的事情,那么你将无法在你的 Java 项目中导入任何生成的类。
关于 Kafka,目前尚不清楚您使用的是什么解串器。如果使用 Confluent 的,您可能需要定义自己的架构,该架构不会在架构注册表中查找编写器架构。
提醒 - 始终可以改用 GenericRecord 类型。
评论
0赞
mgerbracht
11/17/2022
谢谢你的回答。最后,所有者在AVRO架构中添加了一个命名空间,在我看来这是最好的选择。否则,我会按照您的建议尝试使用 GenericRecord。
评论