AVRO联合类型奇怪的序列化格式

时间:2019-07-24 10:59:03

标签: json serialization avro spring-kafka confluent-schema-registry

我在使用 Spring-Kafka API 向在融合平台上运行的代理的主题发送消息时遇到问题。我正在将AVRO模式与 apache-avro-plugin 结合使用,以使maven从模式中生成Java对象。

该架构已在 Confluent Schema Registry 中以正确的格式正确注册,但是当我使用融合的 KafkaAvroSerializer 发送消息时,消息中的联合类型会显示在“怪异”格式。

这是我的AVRO模式

{
  "namespace": "com.mynamespace",
  "name": "MessageValue",
  "doc": "Kafka message value",
  "type": "record",
  "fields": [
    {
      "name": "metadata",
      "type": {
        "name": "Metadata",
        "doc": "metadata model description",
        "type": "record",
        "fields": [
          {
            "name": "eventVersion",
            "type": [
               "null",
               "string"
            ]
          },
          {
            "name": "eventTime",
            "type": "string"
          },
          {
            "name": "eventSource",
            "type": "string"
          },
          {
            "name": "eventKey",
            "type": "string"
          }
        ]
      }
    }
  ]
}

这是已发送给主题的序列化JSON对象:

{
  "metadata": {
    "eventVersion": {
      "string": "1.0"
    },
    "eventTime": "2019-01-01T09:00",
    "eventSource": "Channel1",
    "eventKey": "SomeKey"
  }
}

我的问题是 UNION 类型的字段。正在对其进行序列化,使其看起来像是带有字段的单独json对象:

string: "1.0"

我尝试将架构更改为不像

这样的 UNION 类型
{
   "name": "eventVersion",
   "type": "string",
   "default": "null"
}

但是后来我总是不得不发送该字段,因为它使该字段成为必填字段。

我在他们的文档中也找不到任何相关的内容。 有谁遇到过这个问题,也许知道如何使序列化对象看起来像这样:

{
  "metadata": {
    "eventVersion": "1.0",
    "eventTime": "2019-01-01T09:00",
    "eventSource": "Channel1",
    "eventKey": "SomeKey"
  }
}

编辑 @Dean Van Greunen 打字错误是由我在这里键入问题并从我无法共享的模式中删减了业务信息制成的。在代码中,架构很好。该问题在问题中有具体说明。发送到kafka的序列化JSON对象如下所示:

{
  "metadata": {
    "eventVersion": {
      "string": "1.0"
    },
    "eventTime": "2019-01-01T09:00",
    "eventSource": "Channel1",
    "eventKey": "SomeKey"
  }
}

eventVersion ”字段是我的问题。

...
"eventVersion":{
    "string" : "1.0"
}
...

该字段似乎是带有字段“ string ”和值为“ 1.0 ”的单独对象。我知道由于UNION avro类型的限制,但我想知道如果有解决方法,使其看起来像这样:

{
  "metadata": {
    "eventVersion": "1.0",
    "eventTime": "2019-01-01T09:00",
    "eventSource": "Channel1",
    "eventKey": "SomeKey"
  }
}

eventVersion ”字段为简单类型 String

1 个答案:

答案 0 :(得分:0)

不确定问题,请更新您的问题;但是我发现了一些错误,请参见下文。

您是AVRO方案不正确。字段中的第一个元素缺少,

{
  "namespace": "com.mynamespace",
  "name": "MessageValue",
  "doc": "Kafka message value",
  "type": "record",
  "fields": [
    {
      "name": "metadata",
      "type": {
        "name": "Metadata",
        "doc": "metadata model description",
        "type": "record",
        "fields": [
          {
            "name": "eventVersion",
            "type": [
               "null",
               "string"
            ]
          },
          {
            "name": "eventTime",
            "type": "string"
          },
          {
            "name": "eventSource",
            "type": "string"
          },
          {
            "name": "eventKey",
            "type": "string"
          }
        ]
      }
    }
  ]
}

default出现拼写错误。

{
   "name": "eventVersion",
   "type": "string",
   "default": "null"
}