Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获得Avro模式验证以支持字段别名?_Java_Schema_Avro - Fatal编程技术网

Java 如何获得Avro模式验证以支持字段别名?

Java 如何获得Avro模式验证以支持字段别名?,java,schema,avro,Java,Schema,Avro,我已经在用Avro序列化的记录中重命名了一个字段。我想支持在没有模式注册表的情况下读取数据的旧版本。因此,我将模式的所有版本保留为从类路径加载的资源 这非常有效,并支持模式演化。当旧模式向后兼容时,我可以读取它们序列化的数据。作为确保这一点的一部分,我希望在应用程序启动时验证模式。不幸的是,即使在解码数据时,模式验证也不尊重字段别名 下面是一个简单的例子来证明我的观点: import java.util.Collections; import org.apache.avro.Schema; i

我已经在用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)
很抱歉回答我自己的问题:

我在Arvo用户邮件列表中发现了一个变体,被问到但没有回答

在我看来,SchemaValidator似乎有一个bug,但我不明白为什么会有这样的bug SchemaValidator和SchemaCompatibility都有,所以感觉好像我不在了 什么

简而言之,使用
SchemaCompatibility.checkReaderWriterCompatibility
而不是
SchemaValidatorBuilder
,它将更加完整并重用解码逻辑