You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Java POJO转换为Avro schema的.avsc文件并生成Avro记录后推送到Kafka主题

编程式转换POJO到Avro Schema及自动生成方案

前置依赖

首先引入Apache Avro核心依赖,Maven配置示例:

<dependency>
    <groupId>org.apache.avro</groupId>
    <artifactId>avro</artifactId>
    <version>1.11.3</version> <!-- 可替换为最新稳定版 -->
</dependency>

运行期动态生成Schema与Avro记录

无需手动编写字符串格式的Schema,直接使用Avro自带的反射工具即可完成转换:

  1. 生成Schema代码示例:
import org.apache.avro.Schema;
import org.apache.avro.reflect.ReflectData;

// 一行代码直接从POJO类生成Avro Schema
Schema libraryEventSchema = ReflectData.get().getSchema(LibraryEvent.class);
// 可直接打印查看生成的Schema结构
System.out.println(libraryEventSchema.toString(true));
  1. 直接将POJO实例序列化为Avro字节流,无需手动填充Avro记录字段:
import org.apache.avro.io.DatumWriter;
import org.apache.avro.io.EncoderFactory;
import org.apache.avro.reflect.ReflectDatumWriter;
import java.io.ByteArrayOutputStream;

// 构造普通POJO实例即可
Book book = new Book();
book.setName("Avro实战");
book.setAuthor("测试作者");
LibraryEvent event = new LibraryEvent();
event.setId(1);
event.setName("图书入库");
event.setBook(book);

// 直接序列化POJO为Avro格式字节流
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
DatumWriter<LibraryEvent> writer = new ReflectDatumWriter<>(LibraryEvent.class);
writer.write(event, EncoderFactory.get().directBinaryEncoder(outputStream, null));
byte[] avroBytes = outputStream.toByteArray();

编译期自动生成Schema到out目录

支持通过注解+插件配置的方式,在编译阶段自动扫描POJO生成.avsc格式Schema文件到指定目录,全程无需手动操作:

  1. 给POJO添加可选的Avro注解(用于自定义命名空间、字段别名等,无特殊需求可以不加):
import org.apache.avro.reflect.AvroNamespace;

@AvroNamespace("com.yourbusiness")
public class LibraryEvent {
   private String name;
   private int id;
   private Book book;
   // 必须提供公共无参构造函数
   public LibraryEvent() {}
   // 省略所有字段的getter、setter方法
}

@AvroNamespace("com.yourbusiness")
public class Book{
  private String name;
  private String author;
  public Book() {}
  // 省略所有字段的getter、setter方法
}
  1. 配置Maven插件(Gradle配置逻辑一致)指定输出目录为out:
<plugin>
  <groupId>org.apache.avro</groupId>
  <artifactId>avro-maven-plugin</artifactId>
  <version>1.11.3</version>
  <executions>
    <execution>
      <phase>process-classes</phase>
      <goals>
        <!-- 只生成Schema文件填schema,需要同步生成Avro专用记录类就改成specific -->
        <goal>schema</goal>
      </goals>
      <configuration>
        <!-- 填写POJO所在的源码目录 -->
        <sourceDirectory>${project.basedir}/src/main/java/com/yourbusiness/pojo</sourceDirectory>
        <!-- 指定Schema输出到out目录 -->
        <outputDirectory>${project.build.directory}/out</outputDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

配置完成后执行mvn compile命令,即可自动在target/out目录下生成对应POJO的Avro Schema文件。

注意事项

  • POJO必须提供公共无参构造函数
  • 所有需要序列化的字段需要提供对应的getter、setter方法
  • 自定义嵌套类只要符合上述规则,会被自动解析到Schema结构中

内容的提问来源于stack exchange,提问作者avocado

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:51:02