Когда я использую пользовательское перечисление в функции карты crunch parallelDo
(Avros.reflects(TestEnumType.class)
), я получаю сообщение об ошибке ниже.
Error: org.apache.crunch.CrunchRuntimeException: java.lang.NoSuchMethodException:EntityChangeType.<init>() at org.apache.crunch.types.avro.AvroDeepCopier$AvroReflectDeepCopier.createNewInstance(AvroDeepCopier.java:157)
Как только я изменяю перечисление на класс, сериализация Avro работает нормально. И в enum, и в классе у меня нет конструктора аргументов, и класс объявлен как статический.
Как сериализовать перечисления методом Avros.reflects
?
Перечисление, которое не работает:
public static enum EntityChangeType {
Field1,
Field2,
Field3;
EntityChangeType() {}
}
После представления того же самого перечисления классу это работает:
public static class EntityChangeType {
private final String entityChangeStatus;
public EntityChangeType() {
this(new String("Field1"));
}
public EntityChangeType(String entityChangeStatus) {
this.entityChangeStatus = entityChangeStatus;
}
public String toString() {
return this.entityChangeStatus;
}
public static final EntityChangeType FIELD1 = new EntityChangeType("Field1");
public static final EntityChangeType FIELD2 = new EntityChangeType("Field2");
public static final EntityChangeType FIELD3 = new EntityChangeType("Field3");
}