【问题标题】:Finding all controllers in application查找应用程序中的所有控制器
【发布时间】:2010-09-03 15:07:05
【问题描述】:

如何找到应用程序中运行的所有控制器?

我正在尝试使用 YUI 创建一个菜单,其中只有注册的控制器才会显示菜单。控制器类将创建一个静态列表,其中包含详细说明名称、操作等的各种属性(很像 grails-nav 插件)。

我想创建一个可以找到所有控制器的标记库,确定哪些控制器有这个静态列表,然后查看每个列表并建立一个菜单。

我想我可以使用 ControllerGrailsClass.metaClass.hasProperty 来识别给定的控制器是否具有静态属性 - 但是我如何找到所有要询问的控制器类?

提前致谢

【问题讨论】:

    标签: grails


    【解决方案1】:

    您可以从 GrailsApplication 对象中获取一个列表。示例:

    class TestController {
    
        def grailsApplication // gets injected automatically
    
        def test = {
            grailsApplication.controllerClasses.each { controllerArtefact ->
                def controllerClass = controllerArtefact.getClazz()
                println "$controllerArtefact, $controllerClass"
            }
        }
    }
    

    如果您不在控制器中,您可以像这样获取 grails 应用程序对象:

    import org.codehaus.groovy.grails.commons.ApplicationHolder
    
    def grailsApplication = ApplicationHolder.application
    

    【讨论】:

    • 感谢ataylor 的及时回复。我刚刚在权威指南(通过谷歌搜索)中看到了这一点,它注入了 grailsApplication 类并添加了一系列动态 getter get*Classes 等。另一个值得问的问题是如何找到这些信息?例如,我搜索了 grails API,但该类没有提及这些动态方法。我做了各种谷歌搜索,再次没有找到任何东西。 grails 参考文献没有对这些进行任何参考——我当然还没有找到。
    • 再次感谢ataylor,也将不胜感激有关此信息的良好来源的一些指示。我有 grails 的权威指南,但不记得看到过这种信息。
    • getControllerClasses、getDomainClasses 等方法在 DefaultGrailsApplication.invokeMethod() 和 getProperty() 中动态解析,以支持插件提供的工件类。例如,Quartz 插件添加了一个 Job 工件,因此如果安装了 Quartz 插件,getJobClasses 将返回所有 Job 工件。
    • Harri,我不久前实现了类似的东西;我不记得确切是如何发现这种动态方法的,但我通常会大量使用 google 和 grails 源代码来追踪此类事情。
    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 2017-11-29
    • 2019-02-02
    相关资源
    最近更新 更多