我认为我的问题的简短,一般形式可能是最好的:我如何让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。到目前为止,我有:
这似乎应该这样做,但如果没有,我还尝试了一些其他的东西:
metadata-complete
属性。我的项目根本没有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使用提供的过滤器,而不是自己编写代码。但我能找到的所有过滤器示例都使用内联代码。
正如我所说,这对我来说很新,所以如果我错过了我应该学习的东西,我会对指针和直接回答表示感激。
感谢。
答案 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")是关键。