Учитывая следующую схему 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 вообще не применяется.
Вопрос
- Как я могу сгенерировать идентификатор Organization.class # как UUID?
- Еслив этом нет поддержки Avro, какой обходной путь (желательно повторное использование org.apache.avro.Conversions.UUIDConversion)?