我使用汇合平台0.9.0.1和kafka-avro-serializer 2.0.1。尝试将事件发送到kafka并将其读回来,我不知道如何将事件转换回Java对象。我已经阅读了avro和汇合文档,并且提示这是可行的,但我无法找到一个好的例子。这是我的代码,当我用KafkaConsumer读取它时,我得到一个GenericData $ Record,我的问题是如何将它重新变成Java pojo。我找到了用于序列化对象的bit代码。
这是我的代码:
postIssue: function (issue) {
return getUserConfiguration()
.then(function (response) {
var headers = response.headers;
var token = headers("X-XSRF-TOKEN");
if (token) {
_cookie = token;
if (issue.isValid()) {
var url = _baseURL + "/api/issue/";
var data = JSON.stringify(issue);
var config = {
xhrFields: { withCredentials: true },
headers: { "X-XSRF-TOKEN": _cookie }
};
return $http.post(url, data, config);
}
else {
return $q.reject("Issue doesn't have valid fields to submit");
}
}
else {
return $q.reject("There is no XSRF token on response header");
}
}, function (error) {
return $q.reject("Error getting user's configuration");
});
}
答案 0 :(得分:2)
我从不使用Avro,但是看https://avro.apache.org/docs/1.7.6/api/java/org/apache/avro/generic/GenericRecord.html为什么你不能手动填充你的POJO ......
class MyPojo {
public int v1;
public String v2;
}
// copied from your example code
ConsumerRecords<String, GenericRecord> records = kafkaConsumer.poll(1000);
for (ConsumerRecord<String, GenericRecord> record1 : records) {
GenericRecord avroRecord = record1.value();
MyPojo pojo = new MyPojo();
pojo.v1 = (Integer)avroRecord.get("<fieldname1>");
pojo.v2 = (String)avroRecord.get("<fieldname2>");
// process current pojo
}
不确定这是否有意义。如果这样做,我会将其移动到构造函数MyPojo(GenericRecord)
。
答案 1 :(得分:0)
就像手动将数据从GenericRecord序列化程序中拉出到Java类中一样...为什么在可以拥有反射库的情况下手动编写数据呢?
要自动转换为已注册的Java类型,您将要查看创建自己的KafkaAvroDeserializer,它会创建一个通过ReflectDatumReader创建的SpecificRecord,如本stackoverflow文章中所列... -KafkaAvroDeserializer does not return SpecificRecord but returns GenericRecord