gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:51:21 25 4
gpt4 key购买 nike

我认为我的问题的简短通用形式可能是最好的:如何让 Grails/Spring “看到”依赖库组件,包括不是 Grails Controller 的过滤器和 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。此外,在这种情况下,答案是删除 metadata-complete来自 web.xml 的属性。我的项目根本没有 web.xml。
  • this thread ,有人想在基于非 Controller 的响应之后放置一个过滤器。在我的情况下,激活过滤器本身是问题,而不是它保护什么样的请求/响应。
  • 尝试使用控制台 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 使用提供的过滤器,而不是自己编写代码。但是我能找到的所有过滤器示例都使用了内联代码。

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

    谢谢。

    最佳答案

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

    一、基于注解的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 中。所以你需要用你的组件的包来更新它。您可以指定多个包,因为设置是 ListString s。

    其次,从您的库中安装 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 过滤器。

    祝你好运,节日快乐!

    关于grails - 如何在 Grails 应用程序中使用具有自己的过滤器和非 Controller servlet 的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27641210/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com