是否可以编写一个 Avro 模式/IDL 来生成一个扩展基类或实现接口的 Java 类?
生成的 Java 类似乎扩展了org.apache.avro.specific.SpecificRecordBase
。因此,工具可能是一条出路。但是,我不知道这是否可能。
我见过一些示例,其中建议在每个特定模式中定义显式“类型”字段,其中更多的是关联而不是继承语义。
我在工厂类和代码的其他部分中大量使用我的基类,例如<T extends BaseObject>
。目前,我从 JSON 模式生成了代码,它支持继承。
另一个附带问题:您可以使用 IDL 只定义记录而不使用协议定义吗?我认为答案是否定的,因为编译器抱怨缺少协议关键字。
帮助表示感谢!谢谢。
我找到了一个更好的方法来解决这个问题。查看 Avro 中的架构生成源,我发现类生成逻辑在内部使用 Velocity 架构来生成类。
我修改了record.vm
模板也可以实现我的特定接口。有一种方法可以使用以下命令指定速度目录的位置templateDirectory
maven 构建插件中的配置。
我也改用SpecificDatumWriter
代替reflectDatumWriter
.
<plugin>
<groupId>org.apache.avro</groupId>
<artifactId>avro-maven-plugin</artifactId>
<version>${avro.version}</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>schema</goal>
</goals>
<configuration>
<sourceDirectory>${basedir}/src/main/resources/avro/schema</sourceDirectory>
<outputDirectory>${basedir}/target/java-gen</outputDirectory>
<fieldVisibility>private</fieldVisibility>
<stringType>String</stringType>
<templateDirectory>${basedir}/src/main/resources/avro/velocity-templates/</templateDirectory>
</configuration>
</execution>
</executions>
</plugin>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)