ฉันมีคลาสที่ผู้ใช้จะสืบทอดและนำไปใช้สองวิธี: navigateForwards()
และ navigateBackwards()
(เป็นเว็บแอปพลิเคชันที่เหมือนตัวช่วยสร้าง) ผู้ใช้อาจต้องการเพิ่ม interceptors ให้กับวิธีการเหล่านี้
คลาสอื่น (สมมติว่าเป็นส่วนหนึ่งของเฟรมเวิร์ก) จะค้นหาคลาสย่อยที่เหมาะสม select()
และเรียกใช้เมธอด navigate(String)
ซึ่งจะเรียก navigateForwards()
หรือ navigateBackwards()
เมื่อถึงจุดนั้น interceptors จะไม่ทำงานอีกต่อไปเนื่องจากเป็นการเรียกใช้เมธอดที่ไม่มีพรอกซี ฉันสามารถเพิ่ม interceptors ให้กับเมธอด navigate()
ได้ แต่นั่นไม่ใช่คลาสย่อยของเมธอดที่สนใจจะแทนที่
มีวิธีง่ายๆ ที่จะบอกให้ CDI สกัดกั้นวิธีการที่จะไม่ถูกดักจับหรือไม่?
ฉันเสนอแนวทางทั่วไปสองสามข้อเพื่อแก้ไขปัญหานี้ แต่ไม่มีแนวทางใดที่มีแนวโน้มดีนัก:
รับวัตถุพรอกซีที่โทรหาฉัน นั่นจะต้องมีการฉีดตัวเองบางอย่างที่จำลองการเรียก select() ที่ทำในคลาส "framework"
รับรายการ interceptors สำหรับวิธีการจาก CDI และเรียกด้วยตนเอง ยังไงก็เถอะ.
ใช้ EnableInterceptorsProxyFactory ของ DeltaSpike http://deltaspike.apache.org/documentation/proxy.html เพื่อห่อ
this
นั่นอาจจะช้าและ/หรือเปิดเผยข้อจำกัดอื่นๆ
อาจมีตัวเลือกอื่นสำหรับส่วนขยาย CDI แต่ฉันไม่แน่ใจว่าส่วนขยายนั้นมีความสามารถอะไรบ้าง
ฉันได้ลองพลิกทุกอย่างกลับหัวแล้วใช้มัณฑนากรแทนคลาสพื้นฐานโดยหวังว่าการเรียกไปยังวัตถุผู้รับมอบสิทธิ์จะถูกดัก แต่อย่างน้อยก็ไม่ใช่ใน JBoss EAP 6.x (ส่วนใหญ่น่าจะเป็น 6.4 แต่อาจเป็นเวอร์ชันก่อนหน้าเมื่อฉันทดสอบ)