2011-11-16 112 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