Плагин Apache Avro Maven создает поле UUID вместо строки - PullRequest
1 голос
/ 20 июня 2019

Учитывая следующую схему Avro:

{
    "namespace": "ro.dspr.coreentities",
    "type": "record",
    "name": "Organization",
    "fields": [
      {
        "name": "id",
        "type": "string",
        "logicalType": "uuid"
      },
      {
        "name": "name",
        "type": "string"
      },
      {
        "name": "description",
        "type": "string"
      }
    ]
}

Запуск avro-maven-plugin 1.9.0 goal schema , я получаю:

@org.apache.avro.specific.AvroGenerated
public class Organization extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {

  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"Organization\",\"namespace\":\"ro.dspr.coreentities\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"},\"logicalType\":\"uuid\"},{\"name\":\"name\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"description\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]}");

  // truncated 

  @Deprecated public java.lang.String id;
  @Deprecated public java.lang.String name;
  @Deprecated public java.lang.String description;

  // truncated
}

Я хочусгенерированный POJO для организации должен иметь id UUID, а не String (что у меня сейчас).

Ссылки, на которые я смотрел:

Я вижу логическоевведите def из Avro и есть класс преобразования Я на самом деле пытаюсь вызвать, но не могу соединить точки.

Прочее

Соответствующие части Maven pom

<plugin>
  <groupId>org.apache.avro</groupId>
  <artifactId>avro-maven-plugin</artifactId>
  <version>${avro.version}</version>
  <configuration>
    <sourceDirectory>${avro-files-path}</sourceDirectory>
    <outputDirectory>${project.build.directory}/generated-sources</outputDirectory>
    <stringType>String</stringType>
  </configuration>
  <executions>
    <execution>
      <goals>
        <goal>schema</goal>
      </goals>
      <configuration>
        <sourceDirectory>${avro-files-path}</sourceDirectory>
        <outputDirectory>${project.build.directory}/generated-sources</outputDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

Дополнительная информация

Я на самом деле пытаюсь использовать Avro для придания своим сообщениям Kafka структуры.Я также использую Confluent Schema Registry и Confluent Avro Kafka Serializer.Тем не менее, я думал, что у меня будет только id в качестве String, но если я попытаюсь отправить сообщения в Kafka как что-то не-UUID, это позже не получится.Однако я обнаружил, что на самом деле ограничений нет, и мне удалось отправить любую строку в Kafka.Таким образом, «логический тип» в Avro вообще не применяется.

Вопрос

  1. Как я могу сгенерировать идентификатор Organization.class # как UUID?
  2. Еслив этом нет поддержки Avro, какой обходной путь (желательно повторное использование org.apache.avro.Conversions.UUIDConversion)?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...