可以使用avro的逻辑类型来验证输入数据吗?

Ali*_*ziz 5 java serialization avro deserialization

我试图了解应该如何使用avro的逻辑类型。首先,让我举例说明我要达到的目标。我想写一个新的Logical Type(RegExLogicalType)来验证输入字符串并接受它或引发一些异常。

或让我们说说我期望以这种方式使用的现有受支持的avro逻辑类型(十进制)之一:

  1. 如果指定了无效的十进制逻辑类型,则必须引发异常。类似于当需要强制字段但未提供任何内容时org.apache.avro.AvroRuntimeException: Field test_decimal type:BYTES pos:2 not set and has no default value
  2. 如果指定了有效的十进制逻辑类型,则不会引发异常。

我在文档中找到的只是谈论读/反序列化,而我不知道写/反序列化

语言实现在读取时必须忽略未知的逻辑类型,并应使用基础的Avro类型。如果逻辑类型无效,例如小数位数大于其精度的小数位数,则实现应忽略该逻辑类型并使用基础的Avro类型。

我不希望上面提到的序列化/反序列化行为,我需要有一些与XSD限制(模式)等效的东西,用于根据模式验证数据

如果架构如下,则显示在avro中

{"namespace": "com.stackoverflow.avro",
 "type": "record",
 "name": "Request",
 "fields": [
     {"name": "caller_jwt",  "type": "string", "logicalType": "regular-expression", "pattern": "[a-zA-Z0-9]*\\.[a-zA-Z0-9]*\\.[a-zA-Z0-9]*"},
     {"name": "test_decimal", "type": "bytes", "logicalType": "decimal",  "precision": 4,  "scale": 2}
 ]
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试构建一个对象并将其序列化为:

DatumWriter<Request> userDatumWriter = new SpecificDatumWriter<>(Request.class);
DataFileWriter<Request> dataFileWriter = new DataFileWriter<>(userDatumWriter);

ByteBuffer badDecimal = ByteBuffer.wrap("bad".getBytes());

Request request = Request.newBuilder()
            .setTestDecimal(badDecimal) // bad decimal
            .setCallerJwt("qsdsqdqsd").build(); // bad value according to regEx
dataFileWriter.create(request.getSchema(), new File("users.avro"));
dataFileWriter.append(dcCreationRequest);
dataFileWriter.close();
Run Code Online (Sandbox Code Playgroud)

没有异常被抛出,对象被序列化到users.avro文件

所以我不知道avro的逻辑类型是否可以用于验证输入数据?还是可以使用其他方法来验证输入数据?