การสกัดกั้นถั่ว CDI ที่สร้างด้วยวิธี @Produces

ในแอปพลิเคชัน JEE ของเรา เราได้สร้างคำอธิบายประกอบใหม่ @MyAnnotation ที่เราตั้งค่าไว้บน CDI bean (@ApplicationScoped)
จากนั้นเราก็มี interceptor ที่สกัดกั้น bean ทั้งหมดด้วยคำอธิบายประกอบ @MyAnnotation
ปัญหาคือว่ามันใช้ไม่ได้กับ bean ที่สร้างโดย @Produces วิธีการ
หมายความว่า interceptor ไม่ได้ถูกเรียกใช้

ดังนั้นถ้าเรามีคลาสนี้:

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

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

จากนั้นด้านล่างนี้จะได้ผล:

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

แต่ด้านล่างนี้จะไม่:

@ApplicationScoped
public class MyBeanProducer 
{

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

มีวิธีที่จะทำให้ interceptor สกัดกั้นถั่ว CDI ที่สร้างด้วย @Produces หรือไม่?


person YevgenyL    schedule 23.12.2020    source แหล่งที่มา
comment
คุณได้ลองเพิ่มคำอธิบายประกอบ @MyAnnotation ให้กับวิธี @Produces แล้วหรือยัง?   -  person mtj    schedule 23.12.2020
comment
เหตุใดคุณจึงต้องมี Producer สำหรับ ApplicationScoped Bean   -  person frank    schedule 23.12.2020
comment
โปรดิวเซอร์ของคุณกำลังสร้าง @Dependent bean การพึ่งพาเป็นขอบเขตหลอกและ bean ในขอบเขตนี้ไม่สามารถดักจับได้เนื่องจากตัวดักทำงานผ่านพร็อกซีและขอบเขตหลอกไม่ได้สร้างพรอกซีสำหรับ bean ของพวกเขา คุณได้ลองใส่คำอธิบายประกอบวิธีโปรดิวเซอร์ด้วย @ApplicationScoped แล้วหรือยัง - ดูเหมือนว่านี่คือสิ่งที่คุณต้องการสำหรับ bean นี้   -  person Nikos Paraskevopoulos    schedule 23.12.2020
comment
@mtj ใช่ ฉันพยายามแล้ว การตั้งค่า @MyAnnotation บนเมธอด @Produces ทำให้ interceptor ดักจับเมธอด @Produces เอง แทนที่จะเป็นเมธอด g() ของ MyBean   -  person YevgenyL    schedule 24.12.2020
comment
@NikosParaskevopoulos ใช่ฉันลองแล้วตั้งค่า @ApplicationScoped บนวิธี @Producer แต่ก็ยังไม่มีการสกัดกั้น   -  person YevgenyL    schedule 24.12.2020


คำตอบ (1)


วิธีแก้ไขคือใช้ InterceptionFactory (จาก CDI 2.0) เพื่อพร็อกซี bean ที่ผลิตโดยวิธี @Poduces ซึ่งหมายความว่า:

@ApplicationScoped
public class MyBeanProducer 
{

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

@MyAnnotation ควรอยู่บน MyBean.
MyBean ต้องมีตัวสร้างแบบ no-args จึงจะสามารถพร็อกซีได้ เนื่องจาก interceptionFactory createInterceptedInstance() กำลังทำเช่นนั้น - กำลังสร้างอินสแตนซ์ MyBean
ฉันพบวิธีแก้ไข ที่นี่

person YevgenyL    schedule 25.12.2020