我对Java对象的Avro序列化有一个特定的问题。我有从xsd模式生成的POJO,然后尝试使用avro进行序列化以放置在kafka主题上。一些xmlElement是可选的
测试消息如下所示:
@XmlRootElement(name = "message")
public class Testmessage {
@XmlElement
public String id;
@XmlElement
public String name;
public Testmessage(String id, String name) {
this.id = id;
this.name = name;
}
public Testmessage() { }
@Override
public String toString() {
return "Message{" +
"id='" + id + '\'' +
", name=" + name +
'}';
}
}
序列化和放置在主题上的方法是:
public void sendMessage(Testmessage msg) throws Exception{
DatumWriter<Testmessage> writer = new ReflectDatumWriter<Testmessage>(Testmessage.class);
ByteArrayOutputStream os = new ByteArrayOutputStream();
Encoder encoder = EncoderFactory.get().binaryEncoder(os, null);
writer.write(msg, encoder);
encoder.flush();
os.close();
KeyedMessage<String, byte[]> data = new KeyedMessage<String, byte[]>(TOPIC_NAME, os.toByteArray());
producer.send(data);
}
当我同时发送两个字段时,所有工作均按预期进行。如果我将其中一个字段设为空或将其遗漏,则会从写入中获得NPE。
java.lang.NullPointerException: in Testmessage in string null of string in field id of Testmessage
at org.apache.avro.reflect.ReflectDatumWriter.write(ReflectDatumWriter.java:145)
at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:58)
有任何想法吗?或指出正确的方向
谢谢!
看来发布后我已经设法自己解决了,几天后阅读了互联网
ReflectData reflectData = ReflectData.AllowNull.get();
Schema schema = reflectData.getSchema(Testmessage.class);
DatumWriter<Testmessage> writer = new ReflectDatumWriter<Testmessage>(schema);
似乎很高兴允许使用null。
继续我的下一个错误!这是
org.apache.avro.UnresolvedUnionException: Not in union ["null",{"type":"record","name":"XMLGregorianCalendar","namespace":"javax.xml.datatype","fields":[]}]: 2014-10-22
at org.apache.avro.generic.GenericData.resolveUnion(GenericData.java:604)
at org.apache.avro.generic.GenericDatumWriter.resolveUnion(GenericDatumWriter.java:151)
at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:71)
at org.apache.avro.reflect.ReflectDatumWriter.write(ReflectDatumWriter.java:143)
at org.apache.avro.generic.GenericDatumWriter.writeField(GenericDatumWriter.java:114)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句