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

Vertx 4.5.10中如何启用RouterBuilder的Schema验证?

在Vertx 4.5.10中过滤OpenAPI未定义请求字段的配置方案

要解决RouterBuilder允许未定义请求字段传递到处理器的问题,你可以通过以下几种方式配置:

1. 在OpenAPI规范中声明禁止额外字段

这是最直接的方式,在你的openapi.yaml的请求体Schema里添加additionalProperties: false,明确拒绝未定义字段:

paths:
  /your-api-path:
    post:
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                username:
                  type: string
                age:
                  type: integer
              additionalProperties: false # 禁止任何未定义的字段

当请求包含未定义字段时,Vertx会自动返回400 Bad Request错误,不会将请求传递到处理器。

2. 通过OpenAPIRouterOptions全局配置验证规则

如果无法修改OpenAPI文件,可以通过代码配置全局验证策略,强制拒绝额外字段:

// 配置验证选项,拒绝包含额外字段的请求
ValidationOptions validationOpts = new ValidationOptions()
    .setAdditionalProperties(ValidationOptions.AdditionalPropertiesPolicy.REJECT);

// 构建RouterBuilder时传入配置
OpenAPIRouterOptions routerOpts = new OpenAPIRouterOptions()
    .setRequestBodyValidation(true) // 启用请求体验证
    .setValidationOptions(validationOpts);

RouterBuilder routerBuilder = RouterBuilder.create(vertx, "openapi.yaml", routerOpts);

这种方式会对所有路由生效,只要请求体包含Schema未定义的字段,就会触发验证失败。

3. 自定义处理器手动过滤字段

如果需要保留请求但过滤掉未定义字段(而非直接拒绝),可以添加自定义的BodyHandler来处理:

RouterBuilder routerBuilder = RouterBuilder.create(vertx, "openapi.yaml");

// 从OpenAPI模型中获取目标接口的请求体Schema
Schema requestSchema = routerBuilder.getOpenAPIModel()
    .getPaths()
    .get("/your-api-path")
    .getPost() // 对应你的HTTP方法,比如getPost、getPut等
    .getRequestBody()
    .getContent()
    .get("application/json")
    .getSchema();

Set<String> allowedFields = requestSchema.getProperties().keySet();

// 添加自定义BodyHandler过滤字段
routerBuilder.rootHandler(BodyHandler.create()
    .handler(ctx -> {
        JsonObject originalBody = ctx.getBodyAsJson();
        if (originalBody != null) {
            JsonObject filteredBody = new JsonObject();
            allowedFields.forEach(field -> {
                if (originalBody.containsKey(field)) {
                    filteredBody.put(field, originalBody.getValue(field));
                }
            });
            ctx.setBody(Buffer.buffer(filteredBody.encode()));
        }
        ctx.next();
    }));

这样后续的处理器拿到的请求体只会包含OpenAPI定义的字段。


内容的提问来源于stack exchange,提问作者Ebadta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:30:06