Avro ReflectDatumWriter中的NullPointerException

 那永A_334 发布于 2022-12-13 16:46

我对Java对象的Avro序列化有一个特定的问题.我有从xsd架构生成的POJO,然后我尝试使用av​​ro序列化放置在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{

    DatumWriter writer = 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)

有任何想法吗?或指出我正确的方向

谢谢!

1 个回答
  • 似乎我在发布之后自己决定自己解决这个问题,之后几天阅读互联网

        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)
    

    2022-12-13 16:49 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有