基于Avro Schema验证JSON消息,如何获取所有校验错误?
解决Avro JSON验证收集所有错误的问题
Avro默认的GenericDatumReader遇到第一个校验错误就会抛出异常终止,要收集所有错误,你可以通过配置ValidationAction.COLLECT让reader收集所有校验问题,而非立即终止。修改后的代码如下:
import org.apache.avro.ValidationAction; import org.apache.avro.ValidationException; import org.apache.avro.generic.GenericDatumReader; import org.apache.avro.io.Decoder; import org.apache.avro.io.DecoderFactory; import org.apache.avro.Schema; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.InputStream; import java.util.List; public static boolean validateJson(String json, Schema schema) throws Exception { InputStream input = new ByteArrayInputStream(json.getBytes()); DataInputStream din = new DataInputStream(input); try { // 创建支持收集所有错误的DatumReader GenericDatumReader<?> reader = new GenericDatumReader<>(schema) .withValidationAction(ValidationAction.COLLECT); Decoder decoder = DecoderFactory.get().jsonDecoder(schema, din); reader.read(null, decoder); // 获取所有收集到的校验错误 List<ValidationException> validationErrors = reader.getValidationErrors(); if (!validationErrors.isEmpty()) { System.out.println("所有校验错误:"); for (ValidationException error : validationErrors) { System.out.println("- " + error.getMessage()); } return false; } return true; } catch (Exception e) { // 处理非校验类的异常(比如IO错误) System.out.println("验证过程中出现异常:" + e.getMessage()); return false; } }
关键改动说明:
- 用
withValidationAction(ValidationAction.COLLECT)配置reader,使其收集所有校验错误而非立即抛出异常。 - 调用
reader.getValidationErrors()获取全部错误列表,可遍历输出或做其他后续处理。 - 调整捕获范围为通用
Exception,区分校验错误与IO类等其他异常。
注意:该方案要求Avro版本1.9.0及以上,若使用旧版本需先升级依赖。
内容的提问来源于stack exchange,提问作者Rishabh
相关产品推荐
相关产品推荐

