2011-11-16 100 views
2

我使用Guice在我的Web應用程序中路由請求,並且我想模塊化一些我將要處理的URL模式的路由。理想情況下,我希望能夠做這樣的事情在我ServletModule使用Guice servlets路由子路徑

delegate("/foo/bar/*").to(SomeOtherServletModule.class); 

// in SomeOtherServletModule.configureServlets: 
serve("/foo/bar/quux").with(Quux.class); 

甚至更​​好:

delegatePrefix("/foo/bar/").to(SomeOtherServletModule.class); 

// in SomeOtherServletModule.configureServlets: 
serve("/quux").with(Quux.class); // prefix removed 

這是可能的吉斯?看起來Guice試圖讓ServletModules安裝的綁定成爲一個單例,而這又被存儲在誰知道的地方GuiceServletContextListenerGuiceFilter使用,但是我想解除這個單例,這樣我就可以像委託一樣這不是將所有東西都緊緊地綁定在一個函數中。

回答

3

我是Guice Servlet的創建者。這基本上是不允許的,因爲我們認爲這種模式並不打算以這種方式使用會令人困惑。例如,許多模塊貢獻在「/ *」處註冊的過濾器以提供一些攔截功能(例如事務)。如果您自動爲它們加上前綴,這些可能會意外停止工作。由於servlet模塊可以被安裝,所以這不像對一段代碼保持警惕一樣簡單。另外,使用正則表達式綁定(例如:/\.html$/),如何處理前綴?我們是否支持他們(難題)?或者我們是否正常註冊正則表達式綁定,併爲他們制定一個令人驚訝的例外?

考慮到你所要求的只是用SomeOtherServletModule(「/ myprefix」)中的構造函數來實現的,它知道如何正確映射它自己,我們決定不提供這個功能。

+1

有趣的評論。不過,我認爲這不會是一個巨大的問題 - 人們可以認爲它大致相當於將所有請求代理到另一個Web服務器根目錄的路徑下。儘管任意模塊在同一個servlet容器中進行子派生確實可能會造成混淆,但即使這意味着子模塊將不得不聲明支持這種使用方法,仍然可以通過某種方式實現此目的。但我想這屬於這種情況下的功能請求:) – bdonlan