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

如何在Grails应用程序中使用具有自己的过滤器和非控制器servlet的库?,grails,configuration,togglz,Grails,Configuration,Togglz,我认为我的问题的简短、一般形式可能是最好的:如何让Grails/Spring“看到”依赖库组件,包括不是Grails控制器的过滤器和servlet 具体情况如下: 我想在我的Grails(v2.4.4)应用程序中使用Togglz特性切换库(v2.0.1)。Togglz自带了自己的web控制台servlet和一个TogglzFilter类,该类在启动时进行一些初始化,并设置每个请求的状态。在vanilla spring web应用程序中,这两个应用程序通常通过注释连接,因此url路径[contex

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

具体情况如下: 我想在我的Grails(v2.4.4)应用程序中使用Togglz特性切换库(v2.0.1)。Togglz自带了自己的web控制台servlet和一个TogglzFilter类,该类在启动时进行一些初始化,并设置每个请求的状态。在vanilla spring web应用程序中,这两个应用程序通常通过注释连接,因此url路径
[context root]/togglz/index
调用控制台。(服务器是关键的tc/Tomcat7,我相信它满足了Servlet3.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。另外,在这种情况下,答案是从web.xml中删除
      元数据complete
      属性。我的项目根本没有web.xml
    • 在中,有人想在非基于控制器的响应后放置过滤器。在我的例子中,问题在于激活过滤器本身,而不是它保护什么样的请求/响应
  • 尝试使用console 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)
                }
            }
        }
    }
    
    甚至在它指向null之前,这感觉完全错误,因为我希望Grails使用提供的过滤器,而不是自己编写。但是我能找到的所有过滤器示例都使用内联代码

正如我所说的,这些对我来说都是新的,所以如果我错过了我应该学习的东西,我会像感谢一个直接的答案一样感谢一个指针


谢谢。

所以你的问题有两个方面需要解决

首先,基于注释的Spring配置

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

// Config.groovy
grails.spring.bean.packages = ['the.package.name.goes.here']
在上面的示例中,我的Spring组件位于包
中.package.name.goes.here
中,因此您需要使用组件包更新它。您可以指定多个包,因为设置是
字符串的
列表

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

要开始安装servlet过滤器,首先需要使用命令将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>

我的过滤器
com.example.MyFilter
我的过滤器
/*
servlet过滤器的确切要求和设置可能略有不同,我建议您参考库中的文档

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


祝你好运,节日快乐

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

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