Я переименовал поле в записи, сериализованной в Avro.Я хочу поддержать чтение старых версий данных, без реестра схемы.Поэтому я сохраняю все версии схемы как ресурсы, загруженные из пути к классам.
Это прекрасно работает и поддерживает эволюцию схемы.Я могу читать данные, сериализованные со старыми схемами, когда они обратно совместимы.Как часть обеспечения этого я хочу проверить схемы, когда приложение запускается.К сожалению, проверка схемы не учитывает псевдонимы полей, даже если данные декодирования не выполняются.
Вот простой пример, подтверждающий мою точку зрения:
import java.util.Collections;
import org.apache.avro.Schema;
import org.apache.avro.SchemaBuilder;
import org.apache.avro.SchemaValidationException;
import org.apache.avro.SchemaValidatorBuilder;
public class Bar {
public static void main(String[] args) throws SchemaValidationException {
Schema stringType = SchemaBuilder.builder().stringType();
Schema s1 = SchemaBuilder.builder().record("foo").fields()
.name("test1").type(stringType).noDefault()
.endRecord();
Schema s2 = SchemaBuilder.builder().record("foo").fields()
.name("test2").aliases("test1").type(stringType).noDefault()
.endRecord();
new SchemaValidatorBuilder().canReadStrategy().validateLatest().validate(s2, Collections.singleton(s1));
}
}
Это вызывает следующее исключение:
Exception in thread "main" org.apache.avro.SchemaValidationException: Unable to read schema:
{
"type" : "record",
"name" : "foo",
"fields" : [ {
"name" : "test1",
"type" : "string"
} ]
}
using schema:
{
"type" : "record",
"name" : "foo",
"fields" : [ {
"name" : "test2",
"type" : "string",
"aliases" : [ "test1" ]
} ]
}
at org.apache.avro.ValidateMutualRead.canRead(ValidateMutualRead.java:70)
at org.apache.avro.ValidateCanRead.validate(ValidateCanRead.java:40)
at org.apache.avro.ValidateLatest.validate(ValidateLatest.java:51)
at Bar.main(Bar.java:18)