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
相关产品推荐
相关产品推荐

