CDI Interceptors: Bagaimana cara mencegat panggilan `ini` atau mendapatkan objek proxy saat ini?

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:

  1. Entah bagaimana, dapatkan objek proxy yang memanggil saya. Itu memerlukan semacam injeksi mandiri yang mereplikasi panggilan select() yang dibuat di kelas "framework".

  2. Dapatkan daftar pencegat untuk metode ini dari CDI dan panggil mereka secara manual. Bagaimanapun.

  3. 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).


person marcus    schedule 07.12.2016    source sumber
comment
Satu-satunya cara yang terpikir oleh saya untuk melakukan ini adalah dengan menggunakan dekorator dan melakukan pekerjaan di delegasi - docs.Oracle.com/javaee/6/tutorial/doc/gkhqf.html   -  person John Ament    schedule 09.12.2016
comment
Anda tidak mencegat dekorator, itu tidak akan berhasil, Anda menambahkan logika di dalam metode delegasi itu sendiri   -  person maress    schedule 15.12.2016
comment
Ya, itu suatu kemungkinan. Apakah ada cara untuk meniru pemrosesan anotasi CDI di dekorator sehingga klien tidak menyadari bahwa itu bukan pencegat sebenarnya? Itu akan menjadi saran Anda yang dikombinasikan dengan nomor 2 dalam pertanyaan saya.   -  person marcus    schedule 15.12.2016


Jawaban (1)


Solusi paling sederhana yang saya temukan (yang karena alasan yang tidak jelas belum pernah terpikirkan oleh saya sebelumnya) adalah membuat navigate() statis dan meneruskan objek secara eksplisit (misalnya sebagai self).

Melihat dari luar kelas menjadi sedikit aneh karena sepertinya ia memiliki metode non-statis biasa tetapi memiliki metode statis. OTOH itu berfungsi dan mudah dimengerti. Saya memerlukan objek proxy saat ini jadi saya meneruskannya. Ini sepele dan mempertahankan perilaku pencegat.

Hanya ada beberapa panggilan yang harus diubah dalam proyek saya, tetapi proyek lain akan memiliki kebutuhan yang berbeda sehingga sayangnya ini bukan solusi umum. Itu sebabnya saya tidak menerima jawaban saya sendiri.

person marcus    schedule 19.12.2016