我对Java对象的Avro序列化有一个特定的问题.我有从xsd架构生成的POJO,然后我尝试使用avro序列化放置在kafka主题上.一些xmlElements是可选的
测试消息如下所示:
@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{ DatumWriterwriter = new ReflectDatumWriter (Testmessage.class); ByteArrayOutputStream os = new ByteArrayOutputStream(); Encoder encoder = EncoderFactory.get().binaryEncoder(os, null); writer.write(msg, encoder); encoder.flush(); os.close(); KeyedMessage data = new KeyedMessage (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);
似乎很高兴允许使用空值.
到我的下一个错误!是的
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)