2

我正在使用 Guice 在我的 Web 应用程序中路由请求,并且我想模块化我将要处理的一些 URL 模式的路由。理想情况下,我希望能够在我的ServletModule

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 中可行吗?似乎 Guice 非常努力地使 ServletModules 安装的绑定成为单例,而后者又存储了谁知道在哪里GuiceServletContextListener被使用GuiceFilter,但我想取消单例,这样我就可以像这样委托,而不是将所有内容紧密绑定在一个函数中。

4

1 回答 1

3

我是 Guice Servlet 的创建者。正如您所描述的,这基本上是不允许的,因为我们认为这对于不打算以这种方式使用的模块会造成混淆。

例如,许多模块提供在“/*”处注册的过滤器以提供一些拦截功能(例如事务)。如果您自动为它们添加前缀,它们可能会意外停止工作。鉴于 servlet 模块可以传递安装,这并不像对一段代码保持警惕那么简单。此外,使用正则表达式绑定(例如:/\.html$/),如何处理前缀?我们支持他们(难题)吗?还是我们只是简单地注册正则表达式绑定并为它们创建一个令人惊讶的例外?

考虑到您所要求的可以通过 SomeOtherServletModule("/myprefix") 中知道如何正确映射自身的构造函数轻松实现,我们决定不提供此功能。

于 2011-11-16T23:49:36.143 回答