2013-05-06 33 views
5

我創建使用此代碼多種途徑與部分組成:何時使用路由器的Restlet V分量有多重路線

Component component = new Component(); 
component.getServers().add(Protocol.HTTP, port); 
component.getDefaultHost().attach(pair.uriPattern, pair.restlet); 
component.getDefaultHost().attach("/heartbeat", new HeartbeatRestlet()); 

我的心跳代碼工作。

但是當我使用一個路由器作爲pair.restlet上面不起作用:

Router router = new Router(); 
Restlet fooHandler = new FooRouter(); 
Restlet barHandler = new BarRouter(); 

router.attach("/foo/{fooId}", fooHandler); 
router.attach("/bar/{barId1}/{barId2}", barHandler); 

的文檔的Restlet只給出了使用路由器與Application類的例子:

public class FirstStepsApplication extends Application { 

    @Override 
    public synchronized Restlet createInboundRoot() { 
     Router router = new Router(getContext()); 
     router.attach("/hello", HelloWorldResource.class); 
     return router; 
    } 
} 

實際上,使用我的基於路由器的代碼可以達到與創建不具備URL的效果相同的效果。

所以我問:

  1. 有什麼之間的基於路由器的方法應該是實現和基於組件的方法有什麼區別?
  2. 我可以使用基於路由器的方法獲得此代碼嗎?截至目前,我唯一的解決方案是廢棄多個路由器並附加多個組件,這就需要處理更多的遺留代碼。

回答

1

我看不出在虛擬主機附件上使用路由器的問題,因爲Restlet允許複合元素來構建請求處理鏈。

這裏的問題是,路由器可以支持多種路由,並使用完全匹配的模式(實際上是默認模式)。

讓我們來看一個例子。如果pair.uriPattern包含/test,並且您在此路由上附加了路由器。只有路徑/test將被處理,無論你在路由器上指定了什麼(除了空路由;-)

我想你要實現子路由匹配,所以你應該考慮使用啓動時匹配時路由器的虛擬主機:

Router router = (...) 

Component component = new Component(); 
component.getServers().add(Protocol.HTTP, port); 
component.getDefaultHost() 
      .attach(pair.uriPattern, router) 
      .setMatchingMode(Template.MODE_STARTS_WITH); 
component.getDefaultHost().attach("/heartbeat", new HeartbeatRestlet()); 

在這種情況下,所有與pair.uriPattern值開始請求將被路由器處理。因此,路由器應該被定義這樣的:

Router router = new Router(); 
router.attach("/something", yourRestlet1); 
router.attach("/somethingelse", yourRestlet2); 

在這種情況下,我們將有以下行爲:

  • 路線pair.uriPattern + "/something"yourRestlet1
  • 路線pair.uriPattern + "/somethingelse"處理將yourRestlet2處理

實際上,這樣的方法是組織應用程序代碼的好方法。

希望它能幫到你, Thierry