Vert.x 4.0.3使用vertx-web-validation实现自定义参数校验的方法咨询
Vert.x 4 vertx-web-validation 自定义参数校验实现方案
Vert.x 4 的 vertx-web-validation 组件基于JSON Schema标准实现校验能力,你可以通过两种方式实现原有ParameterTypeValidator的自定义校验效果:
方案1:扩展JSON Schema自定义关键字(官方推荐,和原有实现逻辑最接近)
这种方式可以直接替换原有ParameterTypeValidator的能力,自定义校验逻辑封装在独立的校验器中,可复用性高。
实现步骤:
- 实现
SchemaValidator接口编写自定义校验逻辑,比如你需要的四段下划线结构ID校验器:
import io.vertx.json.schema.Schema; import io.vertx.json.schema.SchemaValidator; import io.vertx.json.schema.ValidationException; import io.vertx.json.schema.ValidationOutput; public class IdSchemaValidator implements SchemaValidator { @Override public ValidationOutput validate(Object value, Schema schema) { // 先判断值是不是字符串类型 if (!(value instanceof String idStr)) { return ValidationOutput.fail(ValidationException.create("ID必须为字符串类型", "id-type-error", value)); } // 校验四段下划线结构 String[] parts = idStr.split("_"); if (parts.length != 4) { return ValidationOutput.fail(ValidationException.create("ID必须为下划线分隔的四段结构", "id-format-error", value)); } // 其他自定义校验逻辑... return ValidationOutput.success(); } }
- 把自定义校验器注册到
SchemaParser中,关联自定义关键字:
// 初始化SchemaParser的时候注册自定义校验器 SchemaParser parser = SchemaParser.createDraft202012SchemaParser(); parser.getValidatorFactory().addValidator("custom-id-validator", schema -> new IdSchemaValidator());
- 定义参数Schema时使用自定义关键字替换原有
stringSchema():
import static io.vertx.json.schema.draft202012.Keywords.*; import io.vertx.json.schema.common.dsl.SchemaBuilder; // 定义自定义ID的Schema SchemaBuilder customIdSchema = stringSchema() .with("custom-id-validator", true); // 这里关联你注册的自定义校验关键字 // 定义Token的自定义Schema同理 SchemaBuilder customTokenSchema = stringSchema() .with("custom-token-validator", true); private ValidationHandler getDeleteRequestValidations(final SchemaParser parser) { return ValidationHandler.builder(parser) .queryParameter(Parameters.param(PARAM__ID, customIdSchema)) .headerParameter(Parameters.param(HEADER_TOKEN, customTokenSchema)) .build(); }
方案2:后置自定义校验处理器(更简单,适合临时轻量校验)
如果不想扩展Schema,也可以在ValidationHandler之后追加一个自定义处理器,直接从请求上下文拿到解析后的参数做校验:
private ValidationHandler getDeleteRequestValidations(final SchemaParser parser) { return ValidationHandler.builder(parser) .queryParameter(Parameters.param(PARAM__ID, stringSchema())) .headerParameter(Parameters.param(HEADER_TOKEN, stringSchema())) .build(); } // 路由注册的时候追加自定义校验逻辑 router.delete("/your/api/path") .handler(getDeleteRequestValidations(parser)) .handler(ctx -> { // 拿到校验通过的参数 RequestParameters params = ctx.get(ValidationHandler.REQUEST_PARAMETERS_CONTEXT_KEY); String id = params.queryParameter(PARAM__ID).getString(); String token = params.headerParameter(HEADER_TOKEN).getString(); // 自定义校验逻辑 if (id.split("_").length !=4) { ctx.response().setStatusCode(400).end("ID格式错误"); return; } // Token校验同理... // 校验通过走后续业务逻辑 ctx.next(); });
如果你的校验逻辑可以用正则表达式覆盖,比如四段下划线的规则可以直接用pattern关键字实现,不需要写自定义校验器:
SchemaBuilder idSchema = stringSchema() .pattern("^[^_]+_[^_]+_[^_]+_[^_]+$");
内容的提问来源于stack exchange,提问作者adhikari
相关产品推荐
相关产品推荐

