【问题标题】:Dynamically insert Enum symbols with Avro java api使用 Avro java api 动态插入枚举符号
【发布时间】:2017-07-30 14:37:48
【问题描述】:

我正在为具有枚举字段的 java 类编写模式。我正在使用这样的 java 模式构建器:

public Schema schema = SchemaBuilder
    .record("MyRecord").namespace("my.name.space")
    .name("myEnum").type().enumeration("MyEnumClass").namespace("enum.name.space")
        .symbols("S1", ..., "S1000").noDefault()
    .endRecord()

问题是 MyEnumClass 中有数百个 Enum 值。可以从我的代码中访问该类。如何在不手动输入的情况下将它们动态插入.symbles()

【问题讨论】:

    标签: java api schema avro


    【解决方案1】:

    正如 DontPanic 在他的回复中所说,您可以使用反射直接从枚举类型构建。但是,如果您没有可使用的 Java 枚举类型,还有另一种方法。

    有问题的方法 EnumBuilder.symbols(String... symbols) 正在使用“vararg”字符串参数。有关可变参数的详细信息,请参阅此内容。 http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html#varargs

    实际上,只要类型匹配,数组就可以转换为可变参数。所以,你可以这样做(下面的代码没有用编译器验证,但你明白了)

    List<String> enumElements = new ArrayList<String>();
    for (int i = 1; i <= 1000; i++) {
      enumElements.add("S"+i);
    };
    String[] enumElementsArray = enumElements.toArray(new String[0]);
    
    public Schema schema = SchemaBuilder
        .record("MyRecord").namespace("my.name.space")
        .name("myEnum").type().enumeration("MyEnumClass").namespace("enum.name.space")
            .symbols(enumElementsArray).noDefault()
        .endRecord();
    

    【讨论】:

      【解决方案2】:

      您可以自动为您的班级创建 avro 架构。

      例如。

      枚举:

      public enum TestEnum {
          VAL1,
          VAL2,
          VAL3
      }
      

      带有枚举字段的类:

      public class TestClass {
          public TestEnum testEnum;
      
          public TestClass() {
      
          }
      
          public TestClass(TestEnum testEnum) {
              this.testEnum = testEnum;
          }
      
          public TestEnum getTestEnum() {
              return testEnum;
          }
      
          public void setTestEnum(TestEnum testEnum) {
              this.testEnum = testEnum;
          }
      }
      

      生成架构:

      Schema schema = ReflectData.get().getSchema(TestClass.class);
      

      结果:

      {
        "type": "record",
        "name": "TestClass",
        "namespace": "q42698247",
        "fields": [
          {
            "name": "testEnum",
            "type": {
              "type": "enum",
              "name": "TestEnum",
              "symbols": [
                "VAL1",
                "VAL2",
                "VAL3"
              ]
            }
          }
        ]
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-18
        • 1970-01-01
        • 2018-10-21
        • 2011-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多