sup*_*eny 4 java reflection serialization avro
我对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 +
'}';
}
}
Run Code Online (Sandbox Code Playgroud)
序列化和放置主题的方法是:
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);
}
Run Code Online (Sandbox Code Playgroud)
当我发送两个字段时,所有按预期工作.如果我将其中一个字段置空或将其遗漏,我会从写入中获取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)
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?或指出我正确的方向
谢谢!
似乎我在发布之后自己决定自己解决这个问题,之后几天阅读互联网
ReflectData reflectData = ReflectData.AllowNull.get();
Schema schema = reflectData.getSchema(Testmessage.class);
DatumWriter<Testmessage> writer = new ReflectDatumWriter<Testmessage>(schema);
Run Code Online (Sandbox Code Playgroud)
似乎很高兴允许使用空值.
到我的下一个错误!是的
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)
Run Code Online (Sandbox Code Playgroud)