优化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}访问,我不理解为什么它是以这种方式实现的。
你们觉得这个方法怎么样?有什么改进的方法吗?对我上面提到的缺点有什么建议或解决办法吗?很抱歉,如果我的问题范围太大,把它分成多个问题是没有意义的