当 avro 模式由另一个模式作为可选字段组成时出现反序列化问题

Issue with deserialization when an avro schema is composed of another schema as an optional field

我们已经定义了一个 avro 架构并使用代码生成器在 Java 和 .cs 文件中生成 .java 文件 C#。

这是我们一直用来从 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" }
]
 }

我可以通过使用 gradle plug-in 设置一个额外的 属性(stringType 为“CharSequence”)来生成我的 .java 来解决这个问题.avsc 文件中的文件。

这是我们用来从 .avsc 文件中生成 .java 文件的 gradle plug-in 的 link

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",我们要求代码生成器 生成字符串类型属性以 java.lang.CharSequence 作为数据类型而不是 java.lang.String