【发布时间】:2019-11-03 06:31:32
【问题描述】:
鉴于以下 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 目标 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,而不是字符串(我现在拥有的)。
我看过的链接:
我确实看到了 logical type def from Avro 并且有 Conversion class 我实际上正在尝试触发,但我无法连接这些点。
其他
相关的 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 作为字符串,但如果我尝试将消息作为非 UUID 的东西发送到 Kafka,它稍后会失败。但是,我发现实际上没有任何约束,并且我设法将任何字符串发送到 Kafka。所以,Avro 中的“logicalType”根本没有强制执行。
问题
- 如何将 Organization.class#id 生成为 UUID?
- 如果在执行此操作时没有 Avro 支持,解决方法是什么(最好重用 org.apache.avro.Conversions.UUIDConversion)?
【问题讨论】:
-
您是否尝试过“logicalType”:“uuid”,从文档看来它需要小写。
-
这实际上是我尝试过的第一件事,但没有成功。在 POJO 的 schema 中,logicalType uuid 存在(并且正确识别,因为不能放任何东西,否则会失败)
-
你找到方法了吗?
-
嗨。不,但说实话,从那以后我就没有尝试过。
标签: java maven code-generation avro