Mencegat kacang CDI yang dibuat dengan metode @Produces

Dalam aplikasi JEE, kita membuat anotasi baru @MyAnnotation yang kita atur pada kacang CDI (@ApplicationScoped).
Lalu kita memiliki interseptor yang mencegat semua kacang dengan anotasi @MyAnnotation.
Masalahnya adalah ini tidak berfungsi untuk kacang yang dibuat oleh @Produces metode.
Artinya interseptor tidak dipanggil.

Jadi jika kita memiliki kelas ini:

@ApplicationScoped
public class OtherClass
{
     @Inject
     private MyBean myBean;

     public void f()
     {
        myBean.g();
     }
}

Maka yang di bawah ini akan berfungsi:

@ApplicationScoped
@MyAnnotation
public class MyBean
{
   public void g() {}
}

Namun yang di bawah ini tidak akan:

@ApplicationScoped
public class MyBeanProducer 
{

    @Produces
    public MyBean create() 
    {
        return new MyBean();
    }
}

Apakah ada cara untuk membuat interseptor mencegat kacang CDI yang dibuat dengan @Produces?


person YevgenyL    schedule 23.12.2020    source sumber
comment
Sudahkah Anda mencoba menambahkan anotasi @MyAnnotation ke metode @Produces?   -  person mtj    schedule 23.12.2020
comment
Mengapa Anda memerlukan Produser untuk ApplicationScoped Bean?   -  person frank    schedule 23.12.2020
comment
Produser Anda sedang membuat kacang @Dependent. Dependen adalah cakupan semu dan kacang dalam cakupan ini tidak dapat dicegat karena pencegat bekerja melalui proxy dan cakupan semu tidak membuat proksi untuk kacangnya. Sudahkah Anda mencoba memberi anotasi pada metode produser dengan @ApplicationScoped - sepertinya inilah yang Anda inginkan untuk kacang ini.   -  person Nikos Paraskevopoulos    schedule 23.12.2020
comment
@mtj ya, saya mencoba. Menyetel @MyAnnotation pada metode @Produces membuat interseptor mencegat metode @Produces itu sendiri, bukan metode g() MyBean.   -  person YevgenyL    schedule 24.12.2020
comment
@NikosParaskevopoulos ya, saya mencoba, mengatur @ApplicationScoped pada metode @Producer tetapi masih tidak ada intersepsi.   -  person YevgenyL    schedule 24.12.2020


Jawaban (1)


Solusinya adalah dengan menggunakan InterceptionFactory (dari CDI 2.0) untuk mem-proxy kacang yang dihasilkan dengan metode @Poduces, artinya:

@ApplicationScoped
public class MyBeanProducer 
{

    @Produces
    public MyBean create(InterceptionFactory<MyBean> interceptionFactory) 
    {
        return interceptionFactory.createInterceptedInstance(new MyBean());
    }
}

@MyAnnotation harus ada di MyBean.
MyBean HARUS MEMILIKI konstruktor tanpa argumen agar dapat diproksi, karena interceptionFactory. createInterceptedInstance() melakukan hal tersebut - memproksi instance MyBean.
Saya menemukan solusinya di sini

person YevgenyL    schedule 25.12.2020