ตัวดัก CDI: จะสกัดกั้นการโทร 'นี้' หรือรับวัตถุพร็อกซีปัจจุบันได้อย่างไร

ฉันมีคลาสที่ผู้ใช้จะสืบทอดและนำไปใช้สองวิธี: navigateForwards() และ navigateBackwards() (เป็นเว็บแอปพลิเคชันที่เหมือนตัวช่วยสร้าง) ผู้ใช้อาจต้องการเพิ่ม interceptors ให้กับวิธีการเหล่านี้

คลาสอื่น (สมมติว่าเป็นส่วนหนึ่งของเฟรมเวิร์ก) จะค้นหาคลาสย่อยที่เหมาะสม select() และเรียกใช้เมธอด navigate(String) ซึ่งจะเรียก navigateForwards() หรือ navigateBackwards() เมื่อถึงจุดนั้น interceptors จะไม่ทำงานอีกต่อไปเนื่องจากเป็นการเรียกใช้เมธอดที่ไม่มีพรอกซี ฉันสามารถเพิ่ม interceptors ให้กับเมธอด navigate() ได้ แต่นั่นไม่ใช่คลาสย่อยของเมธอดที่สนใจจะแทนที่

มีวิธีง่ายๆ ที่จะบอกให้ CDI สกัดกั้นวิธีการที่จะไม่ถูกดักจับหรือไม่?

ฉันเสนอแนวทางทั่วไปสองสามข้อเพื่อแก้ไขปัญหานี้ แต่ไม่มีแนวทางใดที่มีแนวโน้มดีนัก:

  1. รับวัตถุพรอกซีที่โทรหาฉัน นั่นจะต้องมีการฉีดตัวเองบางอย่างที่จำลองการเรียก select() ที่ทำในคลาส "framework"

  2. รับรายการ interceptors สำหรับวิธีการจาก CDI และเรียกด้วยตนเอง ยังไงก็เถอะ.

  3. ใช้ EnableInterceptorsProxyFactory ของ DeltaSpike http://deltaspike.apache.org/documentation/proxy.html เพื่อห่อ this นั่นอาจจะช้าและ/หรือเปิดเผยข้อจำกัดอื่นๆ

อาจมีตัวเลือกอื่นสำหรับส่วนขยาย CDI แต่ฉันไม่แน่ใจว่าส่วนขยายนั้นมีความสามารถอะไรบ้าง

ฉันได้ลองพลิกทุกอย่างกลับหัวแล้วใช้มัณฑนากรแทนคลาสพื้นฐานโดยหวังว่าการเรียกไปยังวัตถุผู้รับมอบสิทธิ์จะถูกดัก แต่อย่างน้อยก็ไม่ใช่ใน JBoss EAP 6.x (ส่วนใหญ่น่าจะเป็น 6.4 แต่อาจเป็นเวอร์ชันก่อนหน้าเมื่อฉันทดสอบ)


person marcus    schedule 07.12.2016    source แหล่งที่มา
comment
วิธีเดียวที่ฉันคิดได้คือใช้มัณฑนากรและทำงานในผู้รับมอบสิทธิ์ - docs.oracle.com/javaee/6/tutorial/doc/gkhqf.html   -  person John Ament    schedule 09.12.2016
comment
คุณไม่ได้สกัดกั้นมัณฑนากรซึ่งใช้ไม่ได้ผล คุณเพิ่มตรรกะภายในวิธีการมอบหมายเอง   -  person maress    schedule 15.12.2016
comment
ใช่นั่นเป็นไปได้ มีวิธีการเลียนแบบการประมวลผลคำอธิบายประกอบของ CDI ในมัณฑนากรหรือไม่เพื่อให้ลูกค้าไม่รู้ว่าไม่ใช่ตัวสกัดกั้นจริงหรือไม่ นั่นจะเป็นข้อเสนอแนะของคุณอย่างมีประสิทธิภาพรวมกับข้อ 2 ในคำถามของฉัน   -  person marcus    schedule 15.12.2016


คำตอบ (1)


วิธีแก้ปัญหาที่ง่ายที่สุดที่ฉันพบ (ซึ่งไม่เคยเกิดขึ้นกับฉันด้วยเหตุผลบางอย่างที่คลุมเครือมาก่อน) กำลังทำให้ navigate() คงที่และส่งผ่านวัตถุอย่างชัดเจน (เช่น self)

เมื่อมองจากภายนอกชั้นเรียนอาจดูแปลกไปสักหน่อย เนื่องจากดูเหมือนว่าจะมีวิธีการที่ไม่คงที่แบบปกติแต่มีวิธีแบบคงที่ OTOH มันทำงานได้และเข้าใจง่าย ฉันต้องการวัตถุพรอกซีปัจจุบันดังนั้นฉันจึงส่งต่อมันไป มันเป็นเรื่องเล็กน้อยและยังคงพฤติกรรมของตัวสกัดกั้นไว้

มีเพียงไม่กี่สายที่ต้องเปลี่ยนแปลงในโปรเจ็กต์ของฉัน แต่โปรเจ็กต์อื่นๆ จะมีความต้องการที่แตกต่างกัน ดังนั้นจึงไม่ใช่วิธีแก้ปัญหาทั่วไป นั่นเป็นสาเหตุที่ฉันไม่ยอมรับคำตอบของตัวเอง

person marcus    schedule 19.12.2016