1

我认为我的问题的简短通用形式可能是最好的:如何让 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 等的各种组合产生了两个未遂事件:
    • 此线程中,其他人无法让 Grails 加载 Togglz。他们在启动时看到了我没有看到的未发现错误,他们关心的是 togglz 的实际应用,而不是控制台 servlet。此外,在这种情况下,答案是metadata-complete从 web.xml 中删除该属性。我的项目根本没有 web.xml。
    • 这个线程中,有人想在基于非控制器的响应之后放置一个过滤器。在我的情况下,激活过滤器本身是问题,而不是它保护什么样的请求/响应。
  • 尝试使用控制台 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 使用提供的过滤器,而不是自己编写代码。但是我能找到的所有过滤器示例都使用了内联代码。

正如我所说,这对我来说很多都是新的,所以如果我错过了我应该研究的东西,我会很感激一个指针和一个直接的答案。

谢谢。

4

2 回答 2

0

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

一、基于注解的Spring配置。

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

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

在上面的示例中,我的 Spring 组件在包中,the.package.name.goes.here因此您需要使用组件的包来更新它。您可以指定多个包,因为设置是 a Listof Strings。

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

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

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

<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.example.MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

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

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

祝你好运,节日快乐!

于 2014-12-25T11:43:24.133 回答
0

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

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

于 2014-12-31T18:40:55.147 回答