You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的能力,自定义校验逻辑封装在独立的校验器中,可复用性高。

实现步骤:
  1. 实现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();
    }
}
  1. 把自定义校验器注册到SchemaParser中,关联自定义关键字:
// 初始化SchemaParser的时候注册自定义校验器
SchemaParser parser = SchemaParser.createDraft202012SchemaParser();
parser.getValidatorFactory().addValidator("custom-id-validator", schema -> new IdSchemaValidator());
  1. 定义参数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 07:36:03