Я понятия не имею, почему перехват, который вы пытаетесь вызвать, вызывается только в некоторых случаях, код выглядит хорошо для меня. Возможно, стоит попробовать один или оба из следующих
Предложение 1
Переместите метапрограммирование из Bootstrap в плагин. Я слышал, что метапрограммирование, подобное этому, всегда должно выполняться при закрытии doWithDynaicMethods
плагина, а не Bootstrap, потому что Bootstrap не всегда (всегда) выполняется при перезагрузке приложения во время выполнения.
Предложение 2
Вместо перехвата методов путем реализации 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.