使用null作为Avro4k中字段的默认值



我使用的是avro4k,我有一个可以为null的字段,如下所示:

@Serializable
data class Product(
@AvroDefault("null")
@ScalePrecision(DEFAULT_SCALE, DEFAULT_PRECISION)
@Serializable(with = BigDecimalSerializer::class)
val price: BigDecimal? = null
)

这是生成的模式:

{
"type" : "record",
"name" : "Product",
"namespace" : "org.company",
"fields" : [ {
"name" : "ask",
"type" : [ {
"type" : "bytes",
"logicalType" : "decimal",
"precision" : 7,
"scale" : 2
}, "null" ],
"default" : "null"
} ]
}

Avro规范要求null不应包含引号。

根据文档:,我认为null类型最后出现在模式中也是一个问题

如上所述,联合使用JSON数组表示。例如,["null","string"]声明了一个模式,该模式可以是null也可以是字符串。(请注意,当为类型为并集的记录字段指定默认值时,默认值的类型必须与并集的第一个元素匹配。因此,对于包含"null"的并集,"null"通常列在第一位,因为此类并集的默认值通常为null。(

有办法解决这两个问题吗?

在这种情况下,应该使用Avro.NULL。

@Serializable
data class Product(
@AvroDefault(Avro.NULL)
@ScalePrecision(DEFAULT_SCALE, DEFAULT_PRECISION)
@Serializable(with = BigDecimalSerializer::class)
val price: BigDecimal? = null
)

它还修复了顺序。

相关内容

  • 没有找到相关文章

最新更新