以下是我的架构:
{
"type":"record",
"name":"UserCreatedEventData",
"namespace":"com.sap.fsm.master.domain.event",
"fields":[
{
"name":"emailAddress",
"type":[
"null",
{
"type":"string",
"avro.java.string":"String"
}
]
},
{
"name":"id",
"type":[
"long"
]
},
{
"name":"name",
"type":[
{
"type":"string",
"avro.java.string":"String"
}
]
}
]
}
这是我得到的记录:
{
"emailAddress":"string",
"name":"string",
"id":0
}
我使用以下方法在 Java 中验证此记录:
@VisibleForTesting
boolean validateAvroSchemaWithValueTwo(String json, Schema schema) throws Exception {
Map<String, Object> kafkaEvent = CustomRuleUtils.jsonStringToMap((String) json);
GenericRecord genericRecord = new GenericData.Record(schema);
for (Schema.Field field : schema.getFields()) {
genericRecord.put(field.name(), kafkaEvent.get(field.name()));
}
GenericDatumReader<GenericRecord> reader = new GenericDatumReader<GenericRecord>(schema);
boolean data = reader.getData().validate(schema, genericRecord);
return data;
}
但是它总是返回false,有正确的记录。我怀疑这是因为架构中的 "avro.java.string":"String"
属性。在我的单元测试中,我包含了类型为 "type":["null", "string"]
的架构,但在运行时,这个 "avro.java.string":"String"
正在进入架构。