У меня есть класс, от которого пользователи будут наследовать и реализовать два метода: navigateForwards()
и navigateBackwards()
(это веб-приложение, похожее на мастер). Пользователь может захотеть добавить к этим методам перехватчики.
Другой класс (скажем, часть фреймворка) найдет подходящий подкласс, select()
его и вызовет метод navigate(String)
, который вызовет либо navigateForwards()
, либо navigateBackwards()
. В этот момент перехватчики больше не будут работать, так как это вызов метода без прокси. Я мог бы добавить перехватчики в метод navigate()
, но это не тот метод, который подклассы заинтересованы в переопределении.
Есть ли простой способ указать CDI перехватить метод, который в противном случае не был бы перехвачен?
Я придумал несколько общих подходов к решению этой проблемы, но ни один из них не кажется многообещающим:
Каким-то образом получить прокси-объект, который вызвал меня. Это потребует какой-то самоинъекции, которая повторяет вызов select(), сделанный в классе "framework".
Получите список перехватчиков для метода из CDI и вызовите их вручную. Как-то.
Используйте фабрику EnableInterceptorsProxyFactory DeltaSpike http://deltaspike.apache.org/documentation/proxy.html. обернуть
this
. Это может быть медленным и/или выявить другие ограничения.
Может быть еще вариант с расширениями CDI, но я не уверен, на что способно расширение.
Я уже пытался перевернуть все с ног на голову и использовать декораторы вместо базового класса в надежде, что вызов объекта делегата будет перехвачен, но этого не произошло, по крайней мере, не в JBoss EAP 6.x (скорее всего, 6.4). , но это могла быть более ранняя версия, когда я тестировал).