Vert.x OpenAPI v4.5.10 ValidatorException:POST 请求“相关请求不包含所需的正文”

问题描述 投票:0回答:1

我正在使用 Vert.x 和 OpenAPI 创建 HTTP 服务器,在处理具有必需正文的请求时遇到 ValidatorException。具体来说,错误信息是:相关请求不包含所需的正文。

public void start() {
    String pathContract = "./api.yaml";
    contract = OpenAPIContract.from(vertx , pathContract);

    contract.onSuccess(contractRes -> {
        routerBuilder = RouterBuilder.create(vertx, contractRes , RequestExtractor.withBodyHandler());

        requestValidator = RequestValidator.create(vertx , contractRes);
        responseValidator = ResponseValidator.create(vertx , contractRes);

        routerBuilder.getRoute("addUser").addHandler(this::addUser);
        router = routerBuilder.createRouter();

        vertx.createHttpServer().requestHandler(router).listen(8000 , res -> {
            if (res.succeeded()) {
                System.out.println("server is running");
            } else {
                System.out.println("error " + res.cause());
            }
        });
        System.out.println("Validator created successfully.");
    }).onFailure(error -> {
        System.out.println("Failed to load OpenAPI contract: " + error.getMessage());
    });
}

public void addUser(RoutingContext ctx) {
    requestValidator.validate(ctx.request(), "addUser").onSuccess(validatedRequest -> {
        JsonObject bodyData = validatedRequest.getBody().getJsonObject();
        String name = bodyData.getString("name");

        if (!name.isEmpty()) {
            ctx.response().end("name is : " + name);
        } else {
            ctx.response().end("error " + name);
        }
    }).onFailure(err -> {
        ctx.response().setStatusCode(400).end("error " + err.getMessage());
    });
}

yaml:

  /user :
    post:
      summary : Add a new user
      operationId: addUser
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
      responses:
        '201':
          description : user created

当我使用route.setDoValidation(false)禁用验证时,请求可以正常工作。

route.setDoValidation(false);

我尝试按照 api.yaml 中的 OpenAPI 定义,在 Vert.x OpenAPI v4.5.10 中为 POST 路由 (/addUser) 设置请求验证。我希望验证器确认所需 JSON 正文的存在和结构。 相反,我收到了 ValidatorException,指出“相关请求不包含所需的正文”。但是,当我使用 route.setDoValidation(false) 禁用验证时,路线会按预期工作,但这会绕过验证,我需要激活验证来检查主体结构。

java gradle openapi vert.x vertx-httpclient
1个回答
0
投票

出现此问题是因为 Vert.x 需要一个正文处理程序来在验证之前提取请求正文。

routerBuilder.rootHandler(BodyHandler.create());
© www.soinside.com 2019 - 2024. All rights reserved.