searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

重写org.everit.json校验器的错误应答消息使之中文化

2023-11-01 01:28:54
7
0

在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失败等  
        }  
    }  
}

 

0条评论
作者已关闭评论
陈青龙
7文章数
0粉丝数
陈青龙
7 文章 | 0 粉丝
原创

重写org.everit.json校验器的错误应答消息使之中文化

2023-11-01 01:28:54
7
0

在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失败等  
        }  
    }  
}

 

文章来自个人专栏
陈青龙个人
7 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0