2016-09-21 41 views
0

我想要为我的Vert.x Web提供的API创建一个URL结构,以清楚说明某些实体在其他实体中的“包含”,以及“遍历实体路径”寻子实体,所以我想用这样的东西来解决的‘大孩子’(我不希望比盛大孩子什么更深):在具有路径参数的路径上安装Vert.x子路由器

GET /entity/:parent_id/sub-entity/:child_id/subsub-entity/:grandchild_id 

所以常我的Router配置看起来像这样:

router.get("/entity/:parent_id/sub-entity/:child_id/subsub-entity/:grandchild_id") 
    .handler(r -> { 
     HttpServerRequest req = r.request(); 
     Minipart p = Entities.get(req.getParameter("parent_id")) 
      .getPart(req.getParameter("child_id")) 
      .getMinipart(req.getParameter("grandchild_id")); 
     // do something with p 
    }); 

当我添加了很多操作(每个级别的每个实体类都有目录和创建操作,每个级别的实体实例都有获取,更新和删除操作,以及其他一些小技巧),我的路由器类变得非常大。

我想使用子路由器卸载子实体经营的路线,所以EntitiesRouter配置可能会做:

router.mountSubRouter("/entity/:parent_id/sub-entity", PartsRouter.init(vertx)); 

然后PartsRouter可以这样做:

router.get("/:child_id").handler(r -> { 
    String parentEntityId = r.request().getParameter("parent_id"); 
    Entity parent = Entities.get(parentEntityId); 
    String myid = r.request().getParameter("child_id"); 
    Part myself = parent.getPart(myid); 
    // do something with myself 
}); 

但是当我尝试尝试并尝试访问子路由器操作时,从Vert.x中收到404错误...

更新:

显然Vert.x明确不支持这一点 - 它扔了,我的包装代码只记录并忽略一个例外,他说:

java.lang.IllegalArgumentException: Can't use patterns in subrouter mounts 

那么,有没有另一种方式来实现我试图做什么(将大型路由器配置分成合适的类层次结构)?

回答

1

我能像2个解决你的问题的办法:

第一个将有处理该请求的公共部分和调用next所以下面的人会延续前停止的地方如初始处理程序:

router.route("/entity/:parent_id/sub-entity", ctx -> { 
    // common part here... 
    ctx.next(); 
}); 

然后:

router.route("/entity/:parent_id/sub-entity/:child_id", ctx -> { 
    String parentEntityId = r.request().getParameter("parent_id"); 
    Entity parent = Entities.get(parentEntityId); 
    String myid = r.request().getParameter("child_id"); 
    Part myself = parent.getPart(myid); 
    // do something with myself 
}); 

或者您可以使用内部重定向,所以你像以前一样,但inste处理的初始代码您呼叫next()的广告会重定向到另一个网址。在这种情况下,您应该在上下文中存储您想要重用的内容,因为请求将在新位置重新启动。

+0

我不知道'ctx.next()',这很有用,但是您的解决方案仍然无法解决在每个单一路由注册中都需要具有所有参数的完整路径的问题, 20次这样的API调用,我希望至少有4次。 – Guss

+0

如果您的问题是重复请求路径,您可以使用'reroute()'方法并将其指向通用处理程序,或者由于路径是普通字符串使用String常量并连接每个处理程序的差异。 –

+0

我最终实现了类似于您的原始答案。我所做的是实现一个类,该类根据嵌套的一组类自动生成'route()'路径,每个类调用API以将其自身添加到“父路由”的顶部。这有点复杂,但有用和表达(我将看到关于将它作为开源发布),但我确实希望Vert.x能够避免'mountSubrouter()'中的麻烦和实现模式。这里肯定缺少一个API。 – Guss