Avro模式中的多态和继承

萨姆

是否可以编写Avro模式/ IDL来生成Java类,该Java类可以扩展基类或实现接口?似乎生成的Java类扩展了org.apache.avro.specific.SpecificRecordBase因此,工具可能是必经之路。但是,我不知道这是否可能。

我已经看到了一些示例,这些示例提出了在每个特定模式中定义一个显式“类型”字段的建议,并具有比继承语义更多的关联性。

我在工厂类和代码的其他部分中大量使用基类,并使用泛型<T extends BaseObject>目前,我已经从支持继承的JSON模式生成了代码。

另一个问题:您可以使用IDL仅定义记录而无需协议定义吗?我认为答案是否定的,因为编译器抱怨缺少协议关键字。

帮助赞赏!谢谢。

萨姆

我找到了解决此问题的更好方法。查看Avro中的Schema生成源,我发现在内部,类生成逻辑使用Velocity模式生成类。

我修改了record.vm模板以也实现我的特定接口。有一种方法可以使用templateDirectoryMaven构建插件中配置指定速度目录的位置

我还改用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>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章