子路由器无法安装在正确的路径上 [英] Sub router cannot be mounted on an exact path

查看:67
本文介绍了子路由器无法安装在正确的路径上的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I would like to do nested routes in vert.x and I have tried the following:

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());
      }
    }
  }
}

当我开始编译应用程序时,我收到了错误消息:

when I start to compile the app, I've got error messsage:

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$5(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$0(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$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: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/*作为公共接口的根路径.

I am trying to create a /api/genders path and in the future I will also create /api/interests. So making /api/* as root path for public interfaces.

关于上述错误,我在做什么错了?

Regarding to error above, What am I doing wrong?

推荐答案

您已经提出了解决方案.

You already suggested a solution for that.

要走的路:

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

这篇关于子路由器无法安装在正确的路径上的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆