Search code examples
javaapischemaavro

Dynamically insert Enum symbols with Avro java api


I'm writing a schema for a java class that has an enum field. I'm using the java schema builder like this:

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

The problem is that there are hundreds of Enum values in MyEnumClass. The class is accessible from my code. How can I insert them dynamically into .symbles() without manually typing them?


Solution

  • You can create avro schema for your class automatically.

    For example.

    Enum:

    public enum TestEnum {
        VAL1,
        VAL2,
        VAL3
    }
    

    Class with enum field:

    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;
        }
    }
    

    Generating schema:

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

    Result:

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