我想为我的Vert.x Web驱动的API创建一个URL结构,清楚地说明了某些实体是如何被包含的#34;在其他实体内以及您如何遍历实体路径"找到子实体,所以我想用这样的东西来解决一个“大孩子”问题。 (我不希望任何比一个大孩子更深的东西):
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
});
当我添加大量操作时(每个级别的每个实体类都有目录和创建操作,并且每个级别实体实例都有获取,更新和删除操作,以及其他一些花絮),我的路由器类真的得到了大。
我在考虑使用子路由器来卸载子实体管理,因此Entities
Router
配置可能会这样做:
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
那么,是否有其他方法可以实现我尝试做的事情(将大型路由器配置拆分为适当的类层次结构)?
答案 0 :(得分:1)
我可以想出解决问题的两种方法:
第一个是拥有一个初始处理程序来处理请求的公共部分并接下来调用,以便下一个处理器将在第一个停止的地方继续,例如:
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
});
或者您可以使用内部重定向,因此您可以像以前一样处理初始代码,而不是调用next()
重定向到另一个URL。在这种情况下,您应该在上下文中存储要重用的内容,因为请求将在新位置重新启动。