将 java POJO 转换为 Avro 模式对象,然后通过 KafkaTemplate 发送到 kafka 服务器
Convert java POJO to Avro schema object then send to kafka server by KafkaTemplate
在我们的 restAPI 中,我们将获得一个复杂的 JSON 负载并将其映射到 POJO。基于 avro avsc 模式文件,我使用 avro-maven-plugin 生成一些 avro 模式 class.
我的问题是,当我们使用 KafkaTemplate 向 kafka 和模式注册表发送消息时,我们需要使用 avro 模式对象发送。由于字段数量巨大,我们无法手动将有效负载请求对象中的值映射到 avro 模式对象中。
将任何 pojo class 转换为 avro genric 记录的两个步骤
使用jackson/avro,用Avro Mapper将pojo转换成字节。
使用 Avro GenericDatumReader 将其读取为通用记录。
public class AvroConverter{
public static GenericRecord convertToGenericRecord(String schemaPath, SomeClass someObject){
Schema schema = new Schema.Parser().setValidate(true).parse(new ClassPathResource(schemaPath).getFile());
AvroSchema avSchema = new AvroSchema(schema);
ObjectWritter writter = new AvroMapper().writer(avSchema);
final byte[] bytes = objectWriter.writeValueAsBytes(someObject);
GenericDatumReader<Object> genericRecordReader = new GenericDatumReader<>(avSchema);
return (GenericRecord) genericRecordReader.read(null, DecoderFactory.get().binaryDecoder(bytes, null));
}
}
Gradle 依赖关系
implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-avro'
在进行序列化时,您可能会遇到问题。为此,您必须配置 avro 映射器属性
在我们的 restAPI 中,我们将获得一个复杂的 JSON 负载并将其映射到 POJO。基于 avro avsc 模式文件,我使用 avro-maven-plugin 生成一些 avro 模式 class.
我的问题是,当我们使用 KafkaTemplate 向 kafka 和模式注册表发送消息时,我们需要使用 avro 模式对象发送。由于字段数量巨大,我们无法手动将有效负载请求对象中的值映射到 avro 模式对象中。
将任何 pojo class 转换为 avro genric 记录的两个步骤
使用jackson/avro,用Avro Mapper将pojo转换成字节。
使用 Avro GenericDatumReader 将其读取为通用记录。
public class AvroConverter{
public static GenericRecord convertToGenericRecord(String schemaPath, SomeClass someObject){
Schema schema = new Schema.Parser().setValidate(true).parse(new ClassPathResource(schemaPath).getFile());
AvroSchema avSchema = new AvroSchema(schema);
ObjectWritter writter = new AvroMapper().writer(avSchema);
final byte[] bytes = objectWriter.writeValueAsBytes(someObject);
GenericDatumReader<Object> genericRecordReader = new GenericDatumReader<>(avSchema);
return (GenericRecord) genericRecordReader.read(null, DecoderFactory.get().binaryDecoder(bytes, null));
}
}
Gradle 依赖关系
implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-avro'
在进行序列化时,您可能会遇到问题。为此,您必须配置 avro 映射器属性