当Avro模式由另一个模式组成的可选字段时,反序列化问题

时间:2020-11-02 21:06:17

标签: apache-kafka avro

我们已经定义了avro模式,并使用代码生成器在Java中生成了.java文件,并在C#中生成了.cs文件。

这是我们一直在使用avro模式生成Java类的代码生成器

https://plugins.gradle.org/plugin/com.commercehub.gradle.plugin.avro

并使用AvroConverter.exe(来自Confluen)从.avsc文件生成.cs文件

现在,我正在尝试使用c#生产者将消息发布到Kafka上,并尝试使用java消费者使用它。除了下面的合同“ OptionalComposition”,该方法适用于大多数数据类型。

反序列化仅针对可选字段(另一种模式)失败

{
 "type": "record",
 "name": "OptionalComposition",
 "doc": "Contract to test composition with optional field ",
 "namespace": "com.abc.avro.contracts",
 "fields": [
{ "name": "partOf", "type": ["null", "com.abc.avro.contracts.Reference"], "default": null }
]
 }

{
 "type": "record",
 "name": "Reference",
 "namespace": "com.abc.avro.contracts",
 "fields": [
{ "name": "identifier", "type": "string" }
,
{ "name": "name", "type": "string" }
]
 }

1 个答案:

答案 0 :(得分:1)

我可以通过使用gradle插件设置额外的属性(将stringType设置为“ CharSequence”)来解决此问题,从而从.avsc文件中生成.java文件。

这是我们用来从.avsc文件中生成.java文件的gradle插件的链接

https://plugins.gradle.org/plugin/com.commercehub.gradle.plugin.avro

这是我正在谈论的财产的文件 https://github.com/davidmc24/gradle-avro-plugin#stringtype

这是我的gradle任务,用于从.avsc文件中生成POJO

task generateContracts(type: GenerateAvroJavaTask, dependsOn: clearContracts) {
    fieldVisibility = "PRIVATE"
    dateTimeLogicalType = 'JSR310'
    outputCharacterEncoding = "UTF-8"
    stringType = "CharSequence"
    source("src/main/resources/avro")
    outputDir = file("src/main/java/")
}

通过添加stringType =“ CharSequence”,我们要求代码生成器执行以下操作: 生成String类型的属性,以java.lang.CharSequence作为数据类型,而不是java.lang.String

相关问题