จับข้อยกเว้นรันไทม์ของ Spring ด้วย Spring AOP

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

ฉันได้ลองสิ่งนี้:

@Aspect
@Component
public class SomeAspect {

@AfterThrowing(pointcut = "execution(* org.springframwork.oxm..*(..))", throwing = "exception")
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED)
public void adviseSpringErrorEvents(JoinPoint joinPoint, final UnmarshallingFailureException exception) throws Throwable {

         LOG.debug(this.getClass().getSimpleName() + " - Error message advice fired on method: " + joinPoint.getSignature().getName());
     }
}

คลาสเป็นแบบ autoproxied และคำแนะนำที่เหลือในคลาสแง่มุมจะเริ่มทำงานอย่างถูกต้อง ดังนั้นจึงต้องมีปัญหากับนิพจน์ AspectJ

อัปเดต: รหัสภายในวิธีการไม่ทำงานและไม่ได้ตั้งใจที่จะจับข้อยกเว้นในคำแนะนำ

มีความคิดอะไรบ้าง? ขอบคุณล่วงหน้า

ป.ล. เวอร์ชัน Spring Framework คือ 3.0.6


person quantum    schedule 10.04.2012    source แหล่งที่มา
comment
คุณหมายถึงไม่สำเร็จที่โค้ดนี้ไม่ทำงานหรือไม่พบข้อยกเว้นใช่หรือไม่ - เพราะถ้าคุณต้องการหยุดการยกเว้นไม่ให้เผยแพร่ คุณจะต้องการ @AroundAdvice แทน   -  person krock    schedule 10.04.2012
comment
รหัสนี้ไม่ทำงานด้วยซ้ำ ดีบักเกอร์ไม่ได้หยุดอยู่ที่จุดพักภายในวิธีการที่กำหนด   -  person quantum    schedule 10.04.2012


คำตอบ (1)


นี่คือสองสิ่งที่โดดเด่นสำหรับฉัน:

  1. จุดตัดของคุณมีไว้สำหรับแพ็คเกจสปริงที่มีข้อยกเว้นที่คุณพยายามจับมันอยู่ ซึ่งควรเป็นจุดที่คุณพยายามเข้าร่วม execution(* com.mypackage..*(..))
  2. คุณกำลังขว้างปา แต่คุณไม่จำเป็นต้องประกาศว่ามีอะไรขว้าง ข้อยกเว้นที่ได้รับการแนะนำจะไม่เผยแพร่ผ่านรหัสนี้

สิ่งที่ต้องลอง:

  1. ขยายพารามิเตอร์ข้อยกเว้นของคุณเป็น Exception บางทีข้อยกเว้นที่คุณกำลังมองหาอยู่ในลำดับชั้นอื่น
  2. ขยาย pointcut ไปที่ * ระดับแพ็คเกจ - แต่อาจเป็นการดีที่สุดที่จะไม่ทำทั้ง 1 และ 2 ในเวลาเดียวกัน
  3. เพิ่มการบันทึกให้อยู่ในระดับที่รุนแรงยิ่งขึ้นเพื่อให้แน่ใจว่าจะไม่ถูกกลืนกินโดยเฟรมเวิร์กการบันทึกของคุณ
person krock    schedule 10.04.2012
comment
ใช่ ฉันได้ลองสิ่งเหล่านี้ก่อนที่จะโพสต์คำถามด้วยซ้ำ อย่างไรก็ตาม ฉันไม่ได้จัดการกระตุ้นให้เกิดคำแนะนำเลย อาจเป็นไปได้ว่า Maven กำลังเล่นกลกับเพื่อนร่วมชั้นของฉัน และฉันก็มองไม่เห็นว่าเกิดอะไรขึ้น พรุ่งนี้ฉันจะลองใช้เทคนิคเล็กๆ น้อยๆ ถ้าฉันทำได้ ฉันจะแจ้งให้คุณทราบ - person quantum; 10.04.2012
comment
ฉันคิดว่าปัญหาหลักคือ pointcut ของคุณมีไว้สำหรับแพ็คเกจ org.springframework.oxm และฉันสงสัยว่านี่คือสิ่งที่คุณต้องการ มันควรเป็นแพ็คเกจสำหรับโค้ดของคุณ - person krock; 10.04.2012
comment
ความคิดของฉันอย่างแน่นอน - นั่นเป็นเหตุผลว่าทำไมฉันถึงเริ่มด้วยนิพจน์ com.mypackage..*(..) เป็นครั้งแรก แต่เนื่องจากนั่นไม่ได้ผล ฉันจึงคิดว่า - มาสกัดกั้นข้อยกเว้นกันเถอะ เรากำลังถูกโยนทิ้ง และนั่นจะต้องเป็นแพ็คเกจ OXM ของ Spring - person quantum; 10.04.2012
comment
จุดรวมของคุณต้องเป็น spring bean ที่อยู่ในบริบทแอปพลิเคชันของคุณ - และเมื่อเดาแล้ว เนื้อหาใน org.spring framework.oxm อาจจะไม่ใช่ spring bean ในตัวมันเอง คุณสามารถทดสอบได้โดยใส่ Before หรือ AfterAdvice ลงบนแพ็คเกจนั้นเพื่อดูว่าเคยถูกเรียกใช้หรือไม่ - person krock; 10.04.2012
comment
นั่นเป็นจุดที่ถูกต้อง ดังนั้น เราสามารถสรุปได้ว่าวิธีเดียวที่จะตรวจจับข้อยกเว้นรันไทม์ของ Spring ก็คือภายใน Spring bean ของเรา ไม่มีวิธีอื่นใดในการบรรลุเป้าหมายนี้ด้วย AOP ใช่ไหม - person quantum; 10.04.2012
comment
หากคุณได้กำหนดค่าหนึ่งใน oxm marshallers ในบริบทสปริงของคุณ คุณควรจะสามารถใช้สิ่งนั้นเป็นจุดรวมและดูข้อยกเว้นที่ถูกส่งออกมาจากที่นั่น ฉันยังไม่เคยใช้ oxm มาก่อน แต่เป็นไปได้ที่ข้อยกเว้นเหล่านี้จะถูกส่งผ่านเลเยอร์ที่คุณไม่สามารถเข้าร่วมได้ ลองเพิ่มระดับการบันทึกบนแพ็คเกจ oxm แทน - person krock; 11.04.2012
comment
ให้เราสนทนาต่อในการแชท - person quantum; 11.04.2012
comment
ขอบคุณสำหรับเวลาและความพยายามของคุณ - ฉันลืมที่จะยอมรับคำตอบของคุณ ยังไม่มีเวลาคิดอย่างละเอียดเกี่ยวกับปัญหาในการจับข้อยกเว้นรันไทม์ด้วย AOP แต่หากพอมีเวลา ฉันจะโพสต์กลับมาที่นี่ - person quantum; 21.05.2012