子路由器不能挂载在一个准确的路径上

Sub router cannot be mounted on an exact path

我想在 vert.x 中做嵌套路由,我尝试了以下方法:

class MainVerticle : AbstractVerticle() {

  private fun apiResource(r: Router): Unit {
    r.route("/api")
      .subRouter(GenderResource(vertx).create())
  }

  private fun rootResource(r: Router): Unit {
    r.route("/").handler {
      val res = it.response()
      res.putHeader("content-type", "text/plain");

      // Write to the response and end it
      res.end("I am healthy");
    }
  }

  override fun start(startPromise: Promise<Void>) {
    val server = vertx.createHttpServer()

    val router = Router.router(vertx)

    apiResource(router)
    rootResource(router)
    server.requestHandler(router).listen(8888) { http ->
      if (http.succeeded()) {
        startPromise.complete()
        println("HTTP server started on port 8888")
      } else {
        startPromise.fail(http.cause());
      }
    }
  }
}

当我开始编译应用程序时,出现错误消息:

java.lang.IllegalStateException: Sub router cannot be mounted on an exact path.
        at io.vertx.ext.web.impl.RouteImpl.subRouter(RouteImpl.java:153)
        at io.databaker.MainVerticle.apiResource(MainVerticle.kt:13)
        at io.databaker.MainVerticle.start(MainVerticle.kt:31)
        at io.vertx.core.impl.DeploymentManager.lambda$doDeploy(DeploymentManager.java:196)
        at io.vertx.core.impl.AbstractContext.dispatch(AbstractContext.java:96)
        at io.vertx.core.impl.AbstractContext.dispatch(AbstractContext.java:59)
        at io.vertx.core.impl.EventLoopContext.lambda$runOnContext[=11=](EventLoopContext.java:40)
        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.run(SingleThreadEventExecutor.java:989)
        at io.netty.util.internal.ThreadExecutorMap.run(ThreadExecutorMap.java:74)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.base/java.lang.Thread.run(Thread.java:834)

导致错误的代码是:

r.route("/api")
 .subRouter(GenderResource(vertx).create())

GenderResource定义如下:

class GenderResource(private val vertx: Vertx) {

  private val router = Router.router(vertx)

  init {
      readAll()
  }

  private fun readAll(): Unit {

    val router = Router.router(vertx)

    router
      .get("/genders")
      .handler {
        val res = it.response()
        res.putHeader("content-type", "text/plain");

        // Write to the response and end it
        res.end("I am genders path");
      }
  }

  fun create(): Router {
    return router
  }
}

我正在尝试创建一个 /api/genders 路径,将来我也会创建 /api/interests。因此,将 /api/* 作为 public 接口的根路径。

关于上面的错误,我哪里做错了?

您已经提出了解决方案。

要走的路:

r.route("/api/*")
      .subRouter(GenderResource(vertx).create())
      .subRouter(InterestsResource(vertx).create())