簡體   English   中英

如何使用 Vert.x Web API 合約與 Quarkus

[英]How to use Vert.x Web API Contract with Quarkus

有人在 Quarkus 上使用 Vert.x Web Api Contract 嗎? 我正在嘗試使用它,但我相信我遇到了配置問題。 這是我嘗試過的:

沒有關於如何配置的直接指南,我將 Vert.x 指南( https://vertx.io/docs/3.9.6/vertx-web-api-contract/java/#_openapi_3 )與 Quarkus反應性路線一( https://quarkus.io/guides/reactive-routes#using-the-vert-x-web-router )。 想法是將來自 OpenAPI3RouterFactory 的路由器安裝為 Quarkus 創建的主路由器的子路由。

不幸的是,當我嘗試訪問我的端點時,我收到以下錯誤:

2021-04-22 21:14:58,696 ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (vert.x-eventloop-thread-4) HTTP Request to /api/tasks failed, error id: 0e695191-ed81-4938-bc0f-3beb2d874a34-4: java.lang.IllegalStateException: Request has already been read
    at io.vertx.core.http.impl.HttpServerRequestImpl.checkEnded(HttpServerRequestImpl.java:596)
    at io.vertx.core.http.impl.HttpServerRequestImpl.handler(HttpServerRequestImpl.java:306)
    at io.quarkus.vertx.http.runtime.ResumingRequestWrapper.handler(ResumingRequestWrapper.java:18)
    at io.vertx.ext.web.impl.HttpServerRequestWrapper.handler(HttpServerRequestWrapper.java:82)
    at io.vertx.ext.web.handler.impl.BodyHandlerImpl.handle(BodyHandlerImpl.java:86)
    at io.vertx.ext.web.handler.impl.BodyHandlerImpl.handle(BodyHandlerImpl.java:42)
    at io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1038)
    at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:137)
    at io.vertx.ext.web.impl.RoutingContextWrapper.next(RoutingContextWrapper.java:176)
    at io.vertx.ext.web.impl.RouterImpl.handleContext(RouterImpl.java:235)
    at io.vertx.ext.web.impl.RouteImpl$$Lambda$556/0x0000000065531848.handle(Unknown Source)
    at io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1038)
    at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:137)
    at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:132)
    at io.quarkus.vertx.http.runtime.VertxHttpRecorder$4.handle(VertxHttpRecorder.java:338)
    at io.quarkus.vertx.http.runtime.VertxHttpRecorder$4.handle(VertxHttpRecorder.java:316)
    at io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1038)
    at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:137)
    at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:132)
    at io.quarkus.vertx.http.runtime.devmode.VertxHttpHotReplacementSetup$3.handle(VertxHttpHotReplacementSetup.java:86)
    at io.quarkus.vertx.http.runtime.devmode.VertxHttpHotReplacementSetup$3.handle(VertxHttpHotReplacementSetup.java:75)
    at io.vertx.core.impl.ContextImpl.lambda$null$0(ContextImpl.java:327)
    at io.vertx.core.impl.ContextImpl$$Lambda$642/0x00000000659026f0.handle(Unknown Source)
    at io.vertx.core.impl.ContextImpl.executeTask(ContextImpl.java:366)
    at io.vertx.core.impl.EventLoopContext.lambda$executeAsync$0(EventLoopContext.java:38)
    at io.vertx.core.impl.EventLoopContext$$Lambda$569/0x0000000065689a48.run(Unknown Source)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base/java.lang.Thread.run(Thread.java:853)

有人知道可能出了什么問題嗎? 這是我的代碼:

package systems.lil.infra.gateway.config;

import io.swagger.v3.oas.models.Operation;
import io.vertx.core.Vertx;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.api.contract.RouterFactoryOptions;
import io.vertx.ext.web.api.contract.openapi3.OpenAPI3RouterFactory;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ApplicationScoped
public class OpenApi3Server {

  private static final Logger logger = LoggerFactory.getLogger(OpenApi3Server.class);

  private Vertx vertx;

  @Inject
  public OpenApi3Server(Vertx vertx) {
    this.vertx = vertx;
  }

  public void init(@Observes Router mainRouter) {

    OpenAPI3RouterFactory.create(vertx, "/api/api.yaml", ar -> {
      if (ar.succeeded()) {
        logger.info("Building OpenAPI Router Factory...");

        OpenAPI3RouterFactory routerFactory = ar.result();

        RouterFactoryOptions options = new RouterFactoryOptions();

        options
            .setOperationModelKey("operationPOJO")
            .setRequireSecurityHandlers(false);
        routerFactory.setOptions(options);

        routerFactory.addHandlerByOperationId("getTasks", routingContext -> {
          routingContext.request().pause();
          Operation operation = routingContext.get("operationPOJO");
          logger.info("Handling operation {}", operation.getOperationId());

          JsonObject object = new JsonObject("{\"operation\":\"getTasks\"}");

          routingContext.response().setStatusCode(200).setStatusMessage("OK").end(object.encodePrettily());

          logger.info("Route called");
        });

        Router router = routerFactory.getRouter();
        mainRouter.mountSubRouter("/api", router);

        logger.info("SubRouter Mounted...");
      }
    });
  }
}

從日志來看,您設置了兩個BodyHandlers

OpenAPI 文檔支持這一點:

Router Factory 自動掛載一個 BodyHandler 來管理請求體。 您可以使用 setBodyHandler 配置 BodyHandler 的實例(例如更改上傳目錄)。

https://vertx.io/docs/3.9.6/vertx-web-api-contract/java/#_body_handler

您可以嘗試將主體處理程序從 OpenAPI 設置為虛擬處理程序:

routerFactory.setBodyHandler(new BodyHandler() {
                    
                    @Override
                    public void handle(RoutingContext event) {
                        event.next();
                    } ...other methods here
          });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM