【问题标题】:Apache Avro is not generating UUIDApache Avro 没有生成 UUID
【发布时间】:2019-12-04 15:18:57
【问题描述】:

无论我尝试什么,Avro 都不会在代码中为字段生成 UUID 类。

版本:1.8.2 和 1.9.1

我尝试使用这样的架构生成 UUID:

  "type": "record",
  "name": "RecordWithUUID",
  "namespace": "avro",
  "fields": [
    {
      "name": "uuid",
      "type": {
        "type": "string",
        "logicalType": "uuid"
      }
    }
  ]
}

这是来自 Avro 项目测试类 TestReflectLogicalTypes::RecordWithUUID 的类 因此,简而言之,这是 Avro 用于测试其代码功能的架构示例,我希望它应该可以工作。

我这样运行以从我的方案中获取 java 代码:

java -jar avro-tools-1.8.2.jar compile schema my_scheme.avsc .

java -jar avro-tools-1.9.1.jar compile schema my_scheme.avsc .

Avro 的初始类代码如下:

class RecordWithUUID {
  UUID uuid; // <- UUID (!!!)

  @Override
  public int hashCode() {
    return uuid.hashCode();
  }

  @Override
  public boolean equals(Object obj) {
    if (obj == null) {
      return false;
    }
    if (!(obj instanceof RecordWithUUID)) {
      return false;
    }
    RecordWithUUID that = (RecordWithUUID) obj;
    return this.uuid.equals(that.uuid);
  }
}

这是我生成后得到的代码:

1.8.2 来自命令行的 avro-tools

  ..

@SuppressWarnings("all")
@org.apache.avro.specific.AvroGenerated
public class RecordWithUUID extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
  private static final long serialVersionUID = 9147582668665082277L;
  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"RecordWithUUID\",\"namespace\":\"avro\",\"fields\":[{\"name\":\"uuid\",\"type\":{\"type\":\"string\",\"logicalType\":\"uuid\"}}]}");
  public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }

  ..

  @Deprecated public java.lang.CharSequence uuid; //<- NO UUID

  ..

命令行中的 1.9.1 avro-tools

 ..

@org.apache.avro.specific.AvroGenerated
public class RecordWithUUID extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
  private static final long serialVersionUID = 9147582668665082277L;
  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"RecordWithUUID\",\"namespace\":\"avro\",\"fields\":[{\"name\":\"uuid\",\"type\":{\"type\":\"string\",\"logicalType\":\"uuid\"}}]}");
  public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }

  ..

   private java.lang.CharSequence uuid; //<- NO UUID
  ..

用于 avro 1.8.2/1.9.1 的 maven 插件

  ..

@org.apache.avro.specific.AvroGenerated
public class RecordWithUUID extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
  private static final long serialVersionUID = 9147582668665082277L;
  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"RecordWithUUID\",\"namespace\":\"avro\",\"fields\":[{\"name\":\"uuid\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\",\"logicalType\":\"uuid\"}}]}");
  public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }

  ..

   private java.lang.String uuid;//<- NO UUID
  ..

那么,这是一个错误还是我做错了什么?

【问题讨论】:

    标签: java avro avro-tools


    【解决方案1】:

    试试 1.10.0-SNAPSHOT,我可以在那里工作(在遇到与其他版本相同的问题之后)

    【讨论】:

    • 在 1.10.2 中相同。也许 OP 和其他人缺少一些东西。
    • 显然 maven PR 仍在等待中,请参阅 issues.apache.org/jira/browse/AVRO-2621
    • @bestwishes - 我只是使用了较新的版本,没有什么可以解决的。让我看看我是否可以在某个地方发布测试
    • 你在使用 gradle 吗?如果可能的话,你能把sn-p作为答案吗?它肯定会帮助很多人。
    猜你喜欢
    • 2020-07-12
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 2020-11-26
    • 2020-03-02
    • 2016-10-23
    相关资源
    最近更新 更多