【问题标题】:Use grailsApplication injection inside UrlMappings在 UrlMappings 中使用 grailsApplication 注入
【发布时间】:2011-12-17 00:28:24
【问题描述】:

由于某种原因,我在使用以下代码时会收到大量错误:

class UrlMappings {
    static grailsApplication
    static mappings = {

    grailsApplication.controllerClasses.each { controllerClass -> // FAILS!
        println(controllerClass.name)
    }

    "/$controller/$action?/$id?"{}

    "/"(view:"/index")
    "500"(view:'/error')
}

错误:http://pastebin.com/tiEsENie


以下代码可以正常工作并打印所有控制器名称:

class UrlMappings {
    static grailsApplication
static mappings = {

    "/$controller/$action?/$id?"{
        grailsApplication.controllerClasses.each { controllerClass -> // WORKS!
            println(controllerClass.name)
        }
    }

    "/"(view:"/index")
    "500"(view:'/error')
}
}

难道不能从static mappings内部访问静态grailsApplication吗?

(我需要能够获取控制器名称以便动态创建 urlmappings)

【问题讨论】:

  • 没有使用$controller 本质上是你想要的吗?为什么你需要遍历控制器并在映射中打印它们?
  • 因为我想把所有的ModeratorControllers拆分成/mod/action
  • 我查看了给定的示例,但由于 ApplicationHolder 在当前 2.0 版本中已弃用,因此无法正常工作
  • 它已被弃用,但它仍然存在并且工作正常。

标签: grails grails-controller


【解决方案1】:

虽然 ApplicationHolder 仍然有效,但 grails 文档在弃用 cmets 中声明了这一点


已弃用:改用依赖注入或实现 GrailsApplicationAware


由于grailsUrlMappingsHolderBean实现了GrailsApplicationAware,所以我发现下面的代码在2.0中也可以使用

class UrlMappings {
    static mappings = {        
        getGrailsApplication().controllerClasses.each{ controllerClass -> 
            if(controllerClass.name./*your logic here*/){
                "/mod/action" {
                    controller = "${controllerClass.name}"
                }
            }
        }
    }
}

【讨论】:

  • 这带来了我的集成测试不再工作的问题。可能是因为我们从静态环境中调用了非静态事物吗?
  • 也破坏了我的集成测试。通过使用 if (Environment.current != Environment.TEST) {..} 来解决
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多