注释可以用来保持Groovy/Grails代码的干燥吗?

注释可以用来保持Groovy/Grails代码的干燥吗?,grails,groovy,controller,annotations,dry,Grails,Groovy,Controller,Annotations,Dry,我正在使用Grails2.2.0建立一个网站,我正在寻找保持代码干燥的最佳实践/建议。这是我第一次使用Grails,我对Groovy和Grails都有一些熟悉,但从任何定义来看,我都不是专家。我确实来自Java+Spring的背景 我有一个虚荣的网址作为要求。本质上,URI被用作查找所需模型的键。如果找不到,请重定向到主页。如果它确实存在,它将在控制器操作的助手中使用(按照闭包的指示,仅在存在时执行)。以下是我当前(工作)来源的一个净化示例: UrlMappings.groovy: "/$gro

我正在使用Grails2.2.0建立一个网站,我正在寻找保持代码干燥的最佳实践/建议。这是我第一次使用Grails,我对Groovy和Grails都有一些熟悉,但从任何定义来看,我都不是专家。我确实来自Java+Spring的背景

我有一个虚荣的网址作为要求。本质上,URI被用作查找所需模型的键。如果找不到,请重定向到主页。如果它确实存在,它将在控制器操作的助手中使用(按照闭包的指示,仅在存在时执行)。以下是我当前(工作)来源的一个净化示例:

UrlMappings.groovy:

"/$groupName/dashboard"(controller: "dashboard", action: "viewAll")
"/$groupName/dashboard/create"(controller: "dashboard", action: "createRecord")
"/$groupName/foo/$action?"(controller: "foo")
BaseController.groovy:

Group requireGroupFromUrl(Closure c) {
  if (params.groupName == null) {
    redirect(controller: "home", action: "index")
    return
  }
  else {
    Group group = Group.findByUrlName(params.groupName)
    if (group == null) {
      redirect(controller: "home", action: "index")
      return
    }

    c.call(group)
  }
}
DashboardController.groovy扩展了BaseController:

def viewAll() {
  requireGroupFromUrl({ Group group -> gymHelper(group)})
}

def viewAllHelper(Group group) {

  // some logic involving 'group'

  def map = [groupInstance: group, /* OTHER CALCULATED/QUERIED PARAMS*/ ]
  render(view: "/groupView", model: map)
}
这很有效。然而,对于辅助方法的需求似乎很困难

乍一看,过滤器似乎可以完成这项工作,但接下来我需要指定从过滤器(/、/login、/register等)中排除哪些路径,这似乎使它与UrlMappings中的条目紧密耦合。或者我可以将
uri
用于多种模式?e、 g.
uri:'*/dashboard/**,*/foo/**'
?如何将检索到的对象向前传递

使用仅注释适用控制器操作的环绕建议进行注释是否可以更好地实现这一点?如果是,方面调用是否可以重定向?如何将检索到的对象传递给带注释的控制器操作?i、 e

@GroupRequired
def viewAll() {
  ...
}
控制器可以干净地完成此任务:

abstract class BaseController {
    def beforeInterceptor = {
        if (params.groupName == null) {
            redirect(controller: "home", action: "index")
            return false
        }

        Group group = Group.findByUrlName(params.groupName)
        if (group == null) {
            redirect(controller: "home", action: "index")
            return false
        }

        // put the group into the params object
        // for use in the controllers
        params.group = group
    }
}

class ChildController extends BaseController {
    def myAction() {
        Group g = params.group

        // do things
    }
}

昨晚,当我开始尝试使用过滤器时,我意识到uri模式将很困难,因为
/$groupName
是我的应用程序中的有效路径。