当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消费者来消费它。这适用于除以下合同";可选成分";。

反序列化仅针对可选字段(另一个架构(失败

{
"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" }
]
}

我可以通过用我的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

这是我的渐变任务,从.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/")
}

通过添加字符串类型=";CharSequence";,我们要求代码生成器生成字符串类型属性,将java.lang.CharSequence作为数据类型,而不是java.lang.String

最新更新