2016-09-21 70 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