Saya memiliki kelas yang akan diwarisi pengguna dan mengimplementasikan dua metode: navigateForwards()
dan navigateBackwards()
(ini adalah aplikasi web seperti penyihir). Pengguna mungkin ingin menambahkan pencegat ke metode ini.
Kelas lain (misalkan itu bagian dari kerangka kerja) akan menemukan subkelas yang sesuai, select()
dan memanggil metode navigate(String)
yang akan memanggil navigateForwards()
atau navigateBackwards()
. Pada saat itu, pencegat tidak akan berfungsi lagi karena ini adalah pemanggilan metode yang tidak diproksi. Saya dapat menambahkan pencegat ke metode navigate()
, tetapi itu bukanlah metode yang ingin ditimpa oleh subkelas.
Apakah ada cara mudah untuk memberitahu CDI untuk mencegat metode yang tidak akan dicegat?
Saya menemukan beberapa pendekatan umum untuk menyelesaikan masalah ini, tetapi tidak ada satupun yang tampak menjanjikan:
Entah bagaimana, dapatkan objek proxy yang memanggil saya. Itu memerlukan semacam injeksi mandiri yang mereplikasi panggilan select() yang dibuat di kelas "framework".
Dapatkan daftar pencegat untuk metode ini dari CDI dan panggil mereka secara manual. Bagaimanapun.
Gunakan EnableInterceptorsProxyFactory DeltaSpike http://deltaspike.apache.org/documentation/proxy.html untuk membungkus
this
. Hal ini mungkin lambat dan/atau mengungkap keterbatasan lainnya.
Mungkin ada opsi lain dengan ekstensi CDI, tapi saya tidak yakin apa yang bisa dilakukan oleh ekstensi tersebut.
Saya sudah mencoba membalikkan semuanya dan menggunakan dekorator alih-alih kelas dasar dengan harapan panggilan ke objek delegasi akan dicegat tetapi tidak berhasil, setidaknya tidak di JBoss EAP 6.x (kemungkinan besar 6.4 , tapi bisa jadi itu adalah versi sebelumnya ketika saya mengujinya).