如何将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自带的反射工具即可完成转换:
- 生成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));
- 直接将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文件到指定目录,全程无需手动操作:
- 给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方法 }
- 配置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
相关产品推荐
相关产品推荐

