【问题标题】:Intercept service method calls using metaprogramming in groovy/grails [duplicate]在 groovy/grails 中使用元编程拦截服务方法调用 [重复]
【发布时间】:2010-02-11 20:20:54
【问题描述】:

我有几个使用 Spring BlazeDS 集成从 Flex 代码调用的 Grails 服务。我想使用 groovy 元类添加一些通用调试日志记录。我在引导类中有以下内容:

class MyBootStrap {

def grailsApplication

def init = { servletContext ->
        initServiceCallLogging()
}

def destroy = {
}

private def initServiceCallLogging() {
    grailsApplication.serviceClasses.each { serviceClass ->
        serviceClass.metaClass.invokeMethod = { name, args ->
            log.debug "Method $name invoked"
            def metaMethod = delegate.metaClass.getMetaMethod(name, args)
            def result = metaMethod.invoke(delegate, args)
            return result

        }
    }
}
}

只要从例如调用 Service 方法就可以正常工作。一个 Grails 控制器或服务,但当直接从 Flex(通过 BlazeDS)调用时,方法调用不会被拦截。

任何人知道如何解决这个问题,或者这不是通过元编程实现的吗?应该使用 Spring AOP 吗?

谢谢

【问题讨论】:

  • Flex(通过 BlazeDS)是否使用不同的类加载器? groovy 中的元编程与加载类的 GroovyClassLoader 相关联。

标签: apache-flex grails groovy metaprogramming


【解决方案1】:

我不知道为什么您尝试的拦截仅在某些情况下被调用,代码对我来说看起来不错。可能值得尝试以下一种或两种方法

建议一

将元编程从 Bootstrap 移到插件中。我听说像这样的元编程应该始终在插件的doWithDynaicMethods 闭包中完成,而不是 Bootstrap,因为在运行时重新加载应用程序时,Bootstrap 不会(总是)执行。

建议二

不用在每个服务的元类上实现invokeMethod来拦截方法,你可以直接在每个类上实现invokeMethod,让服务实现GroovyInterceptable。例如,替换:

class MyService {
// implementation
}

与:

class MyService implements GroovyInterceptable {

  def invokeMethod(String name, args) {
    log.debug "Method $name invoked"

    def originalMethod = Car.metaClass.getMetaMethod(name, args)
    originalMethod.invoke(this, args)
  }
}

这样做的一个明显问题是,它需要您将上述样板也添加到您的所有服务中。但如果它有效,也许您可​​以将其作为 DRYer 解决方案的起点。

【讨论】:

  • 建议 2 对我来说并不是真正的解决方案。我以日志记录为例,但我希望能够动态添加/删除其他功能。无论如何,我通过创建一个 BaseService 类并让所有服务继承来尝试它,但问题仍然存在。当从 Grails 调用服务时可以正常工作,但在通过 Spring 集成直接从 Flex 调用时就不行。问题可能在于 Chris Dail 提到的 ClassLoading 机制,但我必须进一步调查......
【解决方案2】:

这对我有用。可能是因为新版本的 BlazeDS 插件。

一个建议: 而不是写

log.debug` "Method $name invoked

我用:

delegate.log.debug "Service call: ${name}(${args})"

优点是记录器写入发生记录的类而不是引导程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-08
    • 2013-05-23
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2014-10-11
    相关资源
    最近更新 更多