优化Grails控制器中的实体查找(典型的get/findById)

优化Grails控制器中的实体查找(典型的get/findById),grails,error-handling,Grails,Error Handling,几乎每个控制器操作都会根据一些用户输入查找一个或多个实体。一段时间以来,我一直想删除一些无聊的、干巴巴的样板代码: def show = { def entity = null if (params.id && params.id.isLong() && params.id.toLong() >= 0) entity = Book.get(params.id.toLong()) if (!entity) { fl

几乎每个控制器操作都会根据一些用户输入查找一个或多个实体。一段时间以来,我一直想删除一些无聊的、干巴巴的样板代码:

def show = {
   def entity = null
   if (params.id && params.id.isLong() && params.id.toLong() >= 0) 
      entity = Book.get(params.id.toLong())

   if (!entity) {
      flash.message = "Could not find, blah blah blah"
      return redirect(...)
   }

   // Useful code
}
我目前的方法是在所有控制器中注入findEntry方法

void injectFindEntryMethod() {
   grailsApplication.controllerClasses.each { def c ->
      c.metaClass.findDomainEntry = { def domainClass, def entryId ->
         def entry = null
         if (entryId && entryId.isLong() && entryId.toLong() >= 0)
            entry = domainClass.findById(entryId)

         if (!entry)
            throw new DomainInstanceNotFoundException(domainClass, entryId)

         return entry
      }
   }
}
此方法背后的基本思想是,当找不到条目时,它将抛出异常。目前,我正在使用Grails1.1中的声明性错误处理功能捕获此异常

"500"(controller: "error", action: 'domainInstanceNotFound', exception: DomainInstanceNotFoundException)
此解决方案的好处在于,show操作中臃肿的代码减少为:

def show = {
   def entry = findDomainEntry(BlogEntry, params.id)

   // Useful code
}
不幸的是,这也有一些缺点,但嘿,这就是为什么我们有Stackoverflow,对吗-

问题/缺点:

这将导致记录异常的stacktrace,这很烦人,因为我正在ErrorController中处理异常。 我无法访问action方法中的exception对象,但是该对象可以由视图中的${exception}访问,我不理解为什么它是以这种方式实现的。 你们觉得这个方法怎么样?有什么改进的方法吗?对我上面提到的缺点有什么建议或解决办法吗?很抱歉,如果我的问题范围太大,把它分成多个问题是没有意义的