如何在Grails应用程序中使用具有自己的过滤器和非控制器servlet的库?

时间:2014-12-24 19:01:36

标签: grails configuration togglz

我认为我的问题的简短,一般形式可能是最好的:我如何让Grails / Spring“看到”依赖库组件,包括不是Grails控制器的过滤器和servlet?

以下是具体内容: 我想在我的Grails(v2.4.4)应用程序中使用Togglz功能切换库(v2.0.1)。 Togglz带有自己的Web控制台servlet和TogglzFilter类,它在启动时进行一些初始化并设置每个请求状态。在vanilla spring Web应用程序中,这两者通常都是通过注释连接的,因此url路径[context-root]/togglz/index会调用控制台。 (服务器是Pivotal tc / tomcat 7,我认为它满足了Servlet 3.0对注释驱动配置的要求。)我的问题是,如何将这样的东西连接到我的Grails应用程序中?

我是Grails和Togglz的新手,所以我可能会错过一些愚蠢的东西。我尝试过的所有内容都会在控制台URL上生成404。到目前为止,我有:

  • 在BuildConfig.groovy中添加了togglz核心,servlet,控制台和spring依赖项。
  • 添加了org.togglz以及我将Togglz配置(接下来的两项)放到Config.groovy中grails.spring.bean.packages值的包。
  • 创建的类FeatureTogglz和FeatureTogglzConfig,均使用@Component注释。

这似乎应该这样做,但如果没有,我还尝试了一些其他的东西:

  • 搜索Grails,Togglz,Library,Servlet,Filter等的各种组合产生了两个近乎未命中:
    • this thread中,其他人在让Grails加载Togglz时遇到了麻烦。他们在启动时看到未发现的错误,而我没有,他们关心的是togglz的实际应用,而不是控制台servlet。此外,该案例的答案是从web.xml中删除metadata-complete属性。我的项目根本没有web.xml。
    • this thread中,有人想在基于非控制器的响应之后放置过滤器。在我的情况下,激活过滤器本身就是问题,而不是它所保护的那种请求/响应。
  • 使用控制台servlet类作为目标尝试了UrlMappings.groovy条目:

    "/togglz/index"(org.togglz.console.TogglzConsoleServlet)`.
    

    我没有看到这样的例子;我只是想猜测什么可以实现web.xml中的内容。

  • 想想也许问题是Grails没有设置Togglz过滤器,除了为每个请求设置上下文之外,它在启动时做了一些初始化,我创建了conf / TogglzFilters.groovy,再次猜测在内容:

    import org.togglz.servlet.TogglzFilter
    
    public class TogglzFilters {
        def filters = {
            togglzFilter(controller:'*', action:'*') {
                before = {
                    new TogglzFilter().doFilter(request, response, null)
                }
            }
        }
    }
    

    即使在它无效之前,这感觉完全错了,因为我想要的是让Grails使用提供的过滤器,而不是自己编写代码。但我能找到的所有过滤器示例都使用内联代码。

正如我所说,这对我来说很新,所以如果我错过了我应该学习的东西,我会对指针和直接回答表示感激。

感谢。

2 个答案:

答案 0 :(得分:0)

因此,您的问题有两个方面需要解决。

首先,Spring配置基于注释。

org.springframework.context.annotation包中的Spring注释(例如@Configuration甚至只是@Bean)不会被Grails识别,除非您告诉它要扫描哪些包。这是在您的Config.groovy中使用以下行完成的:

// Config.groovy
grails.spring.bean.packages = ['the.package.name.goes.here']

在上面的示例中,我的Spring组件位于包the.package.name.goes.here中,因此您需要使用组件的包更新它。您可以指定多个包,因为该设置为List的{​​{1}}。

其次,从库中安装servlet过滤器。现在,这可以通过多种方式完成,从编写插件为您完成,或手动安装(我将在此处介绍)。

要开始安装servlet过滤器,首先需要使用install templates命令将代码生成期间Grails使用的模板复制到项目中。这些模板将显示在String下。在这种情况下,我们需要修改src/templates以包含servlet过滤器。

通常安装过滤器如下所示:

src/templates/war/web.xml

servlet过滤器的确切要求和设置可能略有不同,我建议您参考库的文档。

通过对Grails应用程序的上述两个更改,您应该能够利用基于Spring注释的配置和库提供的servlet过滤器。

祝你好运,节日快乐!

答案 1 :(得分:0)

如果我的问题是正确的,那么约书亚关于列出豆类包装的答案部分就是正确的。他建议安装模板和编辑生成的web.xml文件也很重要,但不能手动指定过滤器。

谢谢约书亚。事实证明,我对自己的无知的怀疑是有根据的。 Togglz根本没有使用注释。它使用web-fragment.xml文件来定义控制台servlet和请求过滤器。问题是我们已经完成了install-templates的事情,并且生成的web.xml Grails包括metadata-complete="true",它抑制了注释和Web片段扫描。编辑文件以删除该属性(默认为" false")是关键。