我正在使用 Guice 在我的网络应用程序中路由请求,并且我想模块化我将处理的一些 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 安装的绑定(bind)成为单例,而该绑定(bind)又由 GuiceServletContextListener
存储在谁知道的地方,以供 GuiceFilter
使用,但是我想取消单例化,这样我就可以像这样委托(delegate),而不是将所有内容紧密绑定(bind)在单个函数中。
最佳答案
我是 Guice Servlet 的创建者。正如您所描述的那样,这基本上是不允许的,因为我们认为这会让不打算以这种方式使用的模块感到困惑。
例如,许多模块提供在“/*”处注册的过滤器,以提供一些拦截功能(例如事务)。如果您自动添加前缀,它们可能会意外停止工作。鉴于 servlet 模块可以传递安装,这并不像对一段代码保持警惕那么简单。另外,使用正则表达式绑定(bind)(例如:/\.html$/),如何处理前缀?我们支持他们吗(难题)?或者我们只是简单地正常注册正则表达式绑定(bind)并为它们设置一个令人惊讶的异常(exception)?
考虑到您所要求的内容可以通过 SomeOtherServletModule("/myprefix") 中知道如何正确映射自身的构造函数轻松实现,因此我们决定不提供此功能。
关于java - 使用 Guice servlet 路由子路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8147106/