添加Validator后Vertx POST请求体为null的问题排查
问题:Vert.x ValidationHandler引发"Null body"异常
原本正常运行的POST接口,添加Schema验证的ValidationHandler后,调用接口抛出BodyProcessorException,提示"Null body",调试发现JsonBodyProcessorImpl中requestContext.body().buffer()为null。
原因分析
ValidationHandler本身不负责读取HTTP请求体,它依赖BodyHandler先将请求体加载到RoutingContext中。修改后的Router代码移除了初始版本中的BodyHandler.create(),导致请求体未被读取,ValidationHandler尝试获取请求体时自然返回null。
解决方案
在ValidationHandler之前添加BodyHandler,确保请求体先被加载到上下文;同时建议使用构建完成的Schema对象传入验证器,避免重复构建问题。
修改后的Router代码
Router router = Router.router(vertx); router.post("/demo") .handler(BodyHandler.create()) // 优先添加BodyHandler读取请求体 .handler(ValidationHandlerBuilder.create(parser) .body(Bodies.json(objectSchemaBuilder.build(parser))) // 使用构建完成的Schema .build()) .handler(rc -> { try { this.greet(rc); } catch (IOException e) { throw new RuntimeException(e); } });
补充说明
BodyHandler是Vert.x Web中处理请求体的核心处理器,必须在所有需要访问请求体的处理器(包括ValidationHandler)之前添加。- 构建Schema时,
objectSchemaBuilder.build(parser)会生成最终的Schema实例,直接传入Bodies.json()比重复使用Builder更稳妥,避免潜在的状态不一致问题。
内容的提问来源于stack exchange,提问作者Amar Dev
相关产品推荐
相关产品推荐

