我们已经定义了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" }
]
}
答案 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