Grails 2.4.x 在这里。
我要求由 生成的所有 Grails 服务的所有方法都grails create-service <xyz>
使用以下逻辑“包装”/拦截:
try {
executeTheMethod()
} catch(MyAppException maExc) {
log.error(ExceptionUtils.getStackTrace(maExc))
myAppExceptionHandler.handleOrRethrow(maExc)
}
在哪里:
log.error(...)
是您在使用注释对类进行注释时获得的 SLF4J 提供的记录器@Slf4j
;和ExceptionUtils
是来自org.apache.commons:commons-lang3:3.4
; 和myAppExceptionHandler
是类型com.example.myapp.MyAppExceptionHandler
;和- 对于 Grails 服务中定义的每个方法,这种行为都存在(或者在需要以某种方式显式调用的情况下可以选择存在)
所以很明显,这个包装代码也需要包含import
这些类的语句。
因此,例如,如果我有一个WidgetService
看起来像这样的:
class WidgetService {
WidgetDataService widgetDataService = new WidgetDataService()
Widget getWidgetById(Long widgetId) {
List<Widget> widgets = widgetDataService.getAllWidgets()
widgets.each {
if(it.id.equals(widgetId)) {
return it
}
}
return null
}
}
然后在这个 Groovy/Grails/closure 魔术发生之后,我需要代码表现得就像我写的一样:
import groovy.util.logging.Slf4j
import org.apache.commons.lang3.exception.ExceptionUtils
import com.example.myapp.MyAppExceptionHandler
@Slf4j
class WidgetService {
WidgetDataService widgetDataService = new WidgetDataService()
MyAppExceptionHandler myAppExceptionHandler = new MyAppExceptionHandler()
Widget getWidgetById(Long widgetId) {
try {
List<Widget> widgets = widgetDataService.getAllWidgets()
widgets.each {
if(it.id.equals(widgetId)) {
return it
}
}
return null
} catch(MyAppException maExc) {
log.error(ExceptionUtils.getStackTrace(maExc))
myAppExceptionHandler.handleOrRethrow(maExc)
}
}
}
关于我如何能够实现这一目标的任何想法?我担心纯 Groovy 闭包可能会以某种方式干扰 Grails 在运行时对其服务所做的任何事情(因为它们都是没有显式扩展父类的类)。