在org.everit.json.schema.validate中,错误应答默认是以#号开头的这种应答,如下代码所示不是很直观。
public ValidationException(Schema violatedSchema, Class<?> expectedType, Object actualValue) {
this(violatedSchema, expectedType, actualValue, "type");
}
public ValidationException(Schema violatedSchema, Class<?> expectedType, Object actualValue, String keyword) {
this(violatedSchema, new StringBuilder("#"), "expected type: " + expectedType.getSimpleName() + ", found: " + (actualValue == null ? "null" : actualValue.getClass().getSimpleName()), Collections.emptyList(), keyword);
}
private ValidationException(Schema rootFailingSchema, List<ValidationException> causingExceptions) {
this(rootFailingSchema, new StringBuilder("#"), getViolationCount(causingExceptions) + " schema violations found", causingExceptions);
}
我们可以通过实现MessageTemplateProvider
接口来重写校验ValidationException
的message。以下是一个示例代码,演示如何重写ValidationException
的message以使用中文表达参数失败的具体原因。如下代码,我们创建了一个名为CustomMessageTemplateProvider
的类,实现了MessageTemplateProvider
接口。在getMessage()
方法中,我们首先获取原始的错误信息,然后根据校验结果的具体问题类型进行判断,并添加相应的中文描述。例如,如果校验结果的问题类型是类型不匹配,我们将添加" (类型不匹配)"到错误信息的末尾。
import org.everit.json.schema.DefaultValidationException;
import org.everit.json.schema.MessageTemplateProvider;
import org.everit.json.schema.ValidationException;
public class CustomMessageTemplateProvider implements MessageTemplateProvider {
@Override
public String getMessage(ValidationException exception) {
StringBuilder messageBuilder = new StringBuilder();
messageBuilder.append("校验失败: ");
messageBuilder.append(exception.getMessage()); // 原始错误信息
if (exception instanceof DefaultValidationException) {
DefaultValidationException defaultException = (DefaultValidationException) exception;
switch (defaultException.getValidationResult().getProblem()) {
case TYPE:
messageBuilder.append(" (类型不匹配)");
break;
case MANDATORY:
messageBuilder.append(" (缺少必填字段)");
break;
case PATTERN:
messageBuilder.append(" (不符合模式)");
break;
case MAXIMUM:
messageBuilder.append(" (值太大)");
break;
case MINIMUM:
messageBuilder.append(" (值太小)");
break;
// 其他问题类型...
}
}
return messageBuilder.toString();
}
要使用这个自定义的MessageTemplateProvider
,需要在创建DefaultSchemaValidator
实例时将其传递给SchemaValidatorBuilder,代码如下所示
import org.everit.json.schema.Schema;
import org.everit.json.schema.SchemaValidator;
import org.everit.json.schema.SchemaValidatorBuilder;
import org.everit.json.schema.internal.DefaultSchemaValidator;
import org.json.JSONObject;
public class JsonValidator {
public static void main(String[] args) {
// 创建Schema对象
Schema schema = new Schema();
// ... 设置Schema规则 ...
// 创建SchemaValidatorBuilder对象并设置自定义的MessageTemplateProvider
SchemaValidatorBuilder validatorBuilder = new SchemaValidatorBuilder(schema);
validatorBuilder.setMessageTemplateProvider(new CustomMessageTemplateProvider());
// 创建SchemaValidator对象并执行校验
SchemaValidator validator = validatorBuilder.build();
try {
// 待校验的JSON对象
JSONObject json = new JSONObject();
validator.validate(json); // 执行校验并抛出ValidationException异常,包含自定义的错误信息
} catch (ValidationException e) {
System.out.println(e.getMessage()); // 打印自定义的错误信息,包含中文描述的原因
} catch (Exception e) {
System.out.println("发生异常:" + e.getMessage()); // 处理其他异常情况,如解析JSON失败等
}
}
}