Avro到带有嵌套类型的Scala案例类注释

Avro到带有嵌套类型的Scala案例类注释,scala,avro,Scala,Avro,我正在对Kafka上的消息使用Avro序列化,并使用当前使用的一些自定义Scala代码进行处理。以下是具有嵌套记录的基本架构: { "type": "record", "name": "TestMessage", "namespace": "", "fields": [ {"name": "message", "type": "string"}, { "name": "metaData", "type": { "type":

我正在对Kafka上的消息使用Avro序列化,并使用当前使用的一些自定义Scala代码进行处理。以下是具有嵌套记录的基本架构:

{
  "type": "record",
  "name": "TestMessage",
  "namespace": "",
  "fields": [
    {"name": "message", "type": "string"},
    {
      "name": "metaData",
      "type": {
        "type": "record",
        "name": "MetaData",
        "fields": [
          {"name": "source", "type": "string"},
          {"name": "timestamp", "type": "string"}
        ]
      }
    }
  ]
}
我认为注释应该非常简单,就像:

@AvroTypeProvider("schema-common/TestMessage.avsc")
@AvroRecord
case class TestMessage()
消息本身类似于以下内容:

{"message":"hello 1",
 "metaData":{
   "source":"postman",
   "timestamp":"123456789"
 }
}
但是,当我在控制台中记录TestMessage类型或在Kafka使用者中查看输出时,我看到的只是:

{"message":"hello 1"}

而不是我为捕获元数据而添加的子类型。我遗漏了什么?如果我能提供更多信息,请告诉我-谢谢

对于Scala 2.11,这个问题现在应该在版本
0.10.3
和版本
0.4.5
中得到解决

请记住,对于模式中的每个记录类型,都需要一个case类来表示它。对于Scala 2.10,必须首先定义嵌套最多的类。安全定义如下:

@AvroTypeProvider("schema-common/TestMessage.avsc")
@AvroRecord
case class MetaData()

@AvroTypeProvider("schema-common/TestMessage.avsc")
@AvroRecord
case class TestMessage()

嗨@derdc,很抱歉你遇到了这个。我还没有在Kafka测试台上尝试过,但实际上我得到了一个错误,即涉及类元数据的非法循环引用。结果表明,所有具有嵌套记录的测试用例都来自
.avro
文件中的模式,而不是
.avsc
文件,显然它们之间存在我遗漏的差异。我希望在接下来的几天内有时间来解决这个问题,同时你可以使用,或者一次性使用(爱好者帐户,可能加载速度慢)。太棒了,朱利安!刚刚测试了更新,可以确认所有工作。你是开源社区的功劳