Перехватчики CDI: как перехватить вызовы this или получить текущий прокси-объект?

У меня есть класс, от которого пользователи будут наследовать и реализовать два метода: navigateForwards() и navigateBackwards() (это веб-приложение, похожее на мастер). Пользователь может захотеть добавить к этим методам перехватчики.

Другой класс (скажем, часть фреймворка) найдет подходящий подкласс, select() его и вызовет метод navigate(String), который вызовет либо navigateForwards(), либо navigateBackwards(). В этот момент перехватчики больше не будут работать, так как это вызов метода без прокси. Я мог бы добавить перехватчики в метод navigate(), но это не тот метод, который подклассы заинтересованы в переопределении.

Есть ли простой способ указать CDI перехватить метод, который в противном случае не был бы перехвачен?

Я придумал несколько общих подходов к решению этой проблемы, но ни один из них не кажется многообещающим:

  1. Каким-то образом получить прокси-объект, который вызвал меня. Это потребует какой-то самоинъекции, которая повторяет вызов select(), сделанный в классе "framework".

  2. Получите список перехватчиков для метода из CDI и вызовите их вручную. Как-то.

  3. Используйте фабрику EnableInterceptorsProxyFactory DeltaSpike http://deltaspike.apache.org/documentation/proxy.html. обернуть this. Это может быть медленным и/или выявить другие ограничения.

Может быть еще вариант с расширениями CDI, но я не уверен, на что способно расширение.

Я уже пытался перевернуть все с ног на голову и использовать декораторы вместо базового класса в надежде, что вызов объекта делегата будет перехвачен, но этого не произошло, по крайней мере, не в JBoss EAP 6.x (скорее всего, 6.4). , но это могла быть более ранняя версия, когда я тестировал).


person marcus    schedule 07.12.2016    source источник
comment
Единственный способ, который я могу придумать, - это использовать декоратор и выполнить работу в делегате - docs.oracle.com/javaee/6/tutorial/doc/gkhqf.html   -  person John Ament    schedule 09.12.2016
comment
Вы не перехватываете декоратор, это не сработает, вы добавляете логику внутри самого метода делегата   -  person maress    schedule 15.12.2016
comment
Да, это возможность. Есть ли способ имитировать обработку аннотаций CDI в декораторе, чтобы клиент не знал, что это не настоящий перехватчик? Это будут ваши предложения в сочетании с номером 2 в моем вопросе.   -  person marcus    schedule 15.12.2016


Ответы (1)


Самое простое решение, которое я нашел (которое по какой-то неясной причине мне раньше не приходило в голову), - это сделать navigate() статическим и явно передать объект (например, как self).

Со стороны класс выглядит немного странно, так как он может иметь обычный нестатический метод, но имеет статический. OTOH выполняет свою работу и его легко понять. Мне нужен текущий прокси-объект, поэтому я передал его. Это тривиально и сохраняет поведение перехватчика.

В моем проекте нужно изменить всего несколько вызовов, но у других проектов будут другие потребности, поэтому, к сожалению, это не общее решение. Вот почему я не принимаю свой собственный ответ.

person marcus    schedule 19.12.2016