Grails grailApplication.controllerClasses按包排序控制器

时间:2012-02-28 03:25:48

标签: grails groovy controller gorm gsp

我有以下代码来抓取所有控制器,对它进行排序,并在li标签中输出:

<g:each var="c" in="${grailsApplication.controllerClasses.sort { it.fullName } }">
        <li<%= c.logicalPropertyName == controllerName ? ' class="active"' : '' %>>
                <g:link controller="${c.logicalPropertyName}">${c.naturalName}</g:link>
        </li>
</g:each>

我需要按包过滤控制器,即从某个包中抓取控制器。

例如:

com.app.module.mars.controller.HelloController
com.app.module.venus.controller.PrintController

正如您所看到的,我是按模块打包控制器,因此火星将拥有自己的一组控制器,而金星将拥有自己的控制器。然后在UI中我想使用上面的代码(带有一些过滤器),它将模块显示为主菜单,将控制器显示为下拉列表。

我该如何应用这样的过滤器?或者,如果你能指导我正确的方向将是伟大的。感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用GrailsClassUtils.isClassBelowPackage(),它将类和包列表作为参数。所以这应该可以解决问题:

GrailsClassUtils.isClassBelowPackage(c.class, ['com.app.module.mars'])

修改:grailsApplication.controllerClasses可能会为您提供GrailsClass个对象的列表,因此您需要使用c.clazz代替c.class

grailsApplication.controllerClasses.each { c ->
    GrailsClassUtils.isClassBelowPackage(c.clazz, ['com.app.module.mars'])
}

答案 1 :(得分:1)

您可以使用Collection#groupBy按程序包名称对控制器类进行分组。

我目前没有Grails系统进行快速测试,但这只是按包名分组类的一个小例子:

def classes = [Integer, List, String]
def classesByPackage = classes.groupBy { it.package.name }
assert classesByPackage == ['java.lang': [Integer, String], 'java.util': [List]]

然后,您可以遍历每个packageName以生成每个菜单,并通过该包名称下的每个类来生成每个菜单项。有点像...

classesByPackage.each { packageName, packageClasses ->
    println "Menu $packageName"
    packageClasses.each { println "  Item $it.simpleName" }
}

...但是使用GSP风格的循环:)