Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache Avro:UnsolvedUnionException在使用union数据类型时发生异常_Java_Apache_Avro - Fatal编程技术网

Java Apache Avro:UnsolvedUnionException在使用union数据类型时发生异常

Java Apache Avro:UnsolvedUnionException在使用union数据类型时发生异常,java,apache,avro,Java,Apache,Avro,我使用的是对象序列化 对于学校对象,我有一个Avro模式: {"namespace": "com.my.model", "type": "record", "name": "School", "fields": [ {"name": "sid", "type": "int"}, {"name": "size", "type": "long"}, {"name": "other", "type": ["null", "Teacher", "Student"]

我使用的是对象序列化

对于
学校
对象,我有一个Avro模式:

{"namespace": "com.my.model",
 "type": "record",
 "name": "School",
 "fields": [
     {"name": "sid",  "type": "int"},
     {"name": "size",  "type": "long"},
     {"name": "other", "type": ["null", "Teacher", "Student"]}
   ]
}
如上所述,
“other”
字段包含一个联合数据类型,它可以是
null
教师
实例或
学生
实例

教师对象模式:

{"namespace": "com.my.model",
"type": "record",
"name": "Teacher",
    "fields": [
        {"name": "isMale", "type": "boolean"}
    ]
}
{"namespace": "com.my.model",
"type": "record",
"name": "Student",
    "fields": [
        {"name": "age", "type": "int"}
    ]
}
学生对象模式:

{"namespace": "com.my.model",
"type": "record",
"name": "Teacher",
    "fields": [
        {"name": "isMale", "type": "boolean"}
    ]
}
{"namespace": "com.my.model",
"type": "record",
"name": "Student",
    "fields": [
        {"name": "age", "type": "int"}
    ]
}
我用Avro工具编译了上面的模式&Avro自动为我生成了所有Java类

然后,在我的java程序中,我以以下方式创建
School
实例:

School school = new School();
school.setSid(3);
school.setSize(2000);

//create a student object
Student student = new Student();
student.setAge(18);

//set student into school instance
school.setOther(student);
如上所示,学校实例的
other
字段包含一个学生对象。然而,当我编译代码时,我得到了unsolvedUnionException。它抱怨
School
模式的
other
字段的联合数据类型。似乎它无法解析我在Java代码中设置为
学校的
学生
。为什么会出现这种例外?Stacktrace是:

org.apache.avro.UnresolvedUnionException: Not in union ["null",{"type":"record","name":"Student","namespace":"com.my.model","fields":[{"name":"age","type":"long"}]},{"type":"record","name":"Teacher","namespace":"com.model","fields":[{"name":"isMale","type":"boolean"}]}]: false
    at org.apache.avro.generic.GenericData.resolveUnion(GenericData.java:561)
    at org.apache.avro.generic.GenericDatumWriter.resolveUnion(GenericDatumWriter.java:144)
    at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:71)
    at org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:106)
    at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:66)
    at org.apache.avro.generic.GenericDatumWriter.writeArray(GenericDatumWriter.java:131)
    at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:68)
    at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:73)
    at org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:106)
    at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:66)
    at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:58)

我可能弄错了,但我认为联合类型应该只包含一个非默认值:

{
    "name": "other",
    "type": [
        "null",
        "Teacher",
        "Student"
    ]
}
应该是:

{
    "name": "other",
    "type": [
        "null",
        {
            "name": "Visitors",
            "symbols": [
                "Student",
                "Teacher"
            ],
            "type": "enum"
        }
    ]
}