Tangkap pengecualian runtime Spring dengan Spring AOP

Untuk tujuan logging, kami mencoba menangkap berbagai pengecualian runtime Spring melalui AOP Spring sendiri dan saya harus mengatakan saya tidak berhasil, jadi saya akan menghargai ide apa pun tentang cara melakukan pendekatan ini.

Saya sudah mencoba sesuatu seperti ini:

@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());
     }
}

Kelas diproksi otomatis dan saran lainnya di kelas aspek diaktifkan dengan benar, jadi pasti ada masalah dengan ekspresi AspectJ.

PEMBARUAN: Kode di dalam metode tidak berjalan dan bukan maksud saya untuk menangkap pengecualian dalam saran.

Ada ide? Terima kasih sebelumnya.

P.S. Versi kerangka pegas adalah 3.0.6.


person quantum    schedule 10.04.2012    source sumber
comment
Apakah yang Anda maksud dengan kegagalan adalah kode ini bahkan tidak berjalan atau tidak menangkap pengecualian? - karena jika Anda ingin menghentikan penyebaran pengecualian, Anda memerlukan @AroundAdvice sebagai gantinya.   -  person krock    schedule 10.04.2012
comment
Kode ini bahkan tidak berjalan. Debugger tidak berhenti pada breakpoint di dalam metode yang diberikan.   -  person quantum    schedule 10.04.2012


Jawaban (1)


Berikut beberapa hal yang menonjol bagi saya:

  1. Poin Anda yang dipotong adalah untuk paket pegas yang berisi pengecualian yang Anda coba tangkap, itu seharusnya berada di tempat Anda mencoba bergabung execution(* com.mypackage..*(..)).
  2. Anda melempar barang yang bisa dibuang tetapi Anda tidak perlu menyatakan apa pun yang dilempar. Pengecualian yang disarankan tidak akan disebarkan melalui kode ini.

Hal yang perlu dicoba:

  1. Perluas parameter pengecualian Anda ke Exception. Mungkin pengecualian yang Anda cari berada dalam hierarki yang berbeda.
  2. Perluas titik potong ke * tingkat paket - tetapi mungkin lebih baik tidak melakukan 1 dan 2 secara bersamaan.
  3. Tingkatkan logging ke tingkat yang lebih parah untuk memastikan logging tidak tertelan oleh kerangka logging Anda.
person krock    schedule 10.04.2012
comment
Ya, saya sudah mencoba hal-hal ini bahkan sebelum saya memposting pertanyaan, namun saya tidak berhasil memancing saran untuk memecat. Mungkin Maven sedang mempermainkan classpath saya dan saya tidak mengerti apa yang terjadi. Saya akan mencoba beberapa trik besok - jika saya berhasil memecatnya, saya akan memberi tahu Anda. - person quantum; 10.04.2012
comment
Saya pikir masalah utamanya adalah pointcut Anda ditujukan untuk paket org.springframework.oxm dan saya ragu ini yang Anda inginkan, itu harus menjadi paket untuk kode Anda. - person krock; 10.04.2012
comment
Pikiran saya persis - itu sebabnya saya pertama kali memulai dengan sesuatu seperti ekspresi com.mypackage..*(..), tetapi karena itu tidak berhasil, saya pikir - mari kita hentikan pengecualian itu segera setelah itu dilempar dan itu pasti paket OXM Spring. - person quantum; 10.04.2012
comment
Titik bergabung Anda harus berupa spring bean yang berada dalam konteks aplikasi Anda - dan mungkin saja, hal-hal di org.spring framework.oxm mungkin tidak akan menjadi spring bean dengan sendirinya. Anda dapat mengujinya dengan meletakkan Saran Sebelum atau Sesudah pada paket tersebut untuk melihat apakah paket tersebut pernah dipanggil. - person krock; 10.04.2012
comment
Itu adalah poin yang valid. Jadi, bisakah kita menyimpulkan bahwa satu-satunya cara untuk menangkap pengecualian runtime Spring adalah dengan menggunakan Spring beans kita? Tidak ada cara lain yang licik untuk mencapai hal ini dengan AOP? - person quantum; 10.04.2012
comment
Jika Anda telah mengonfigurasi salah satu marshaller oxm dalam konteks pegas, Anda seharusnya dapat menggunakannya sebagai titik gabungan dan melihat pengecualian yang dikeluarkan dari sana. Saya belum pernah menggunakan oxm sebelumnya, tetapi mungkin saja pengecualian ini terjadi melalui lapisan yang tidak dapat Anda ikuti. Pertimbangkan untuk meningkatkan level logging pada paket oxm itu sendiri. - person krock; 11.04.2012
comment
mari kita melanjutkan diskusi ini di chat - person quantum; 11.04.2012
comment
Terima kasih atas waktu dan usaha Anda - Saya lupa menerima jawaban Anda. Masih belum punya waktu untuk memikirkan secara menyeluruh tentang masalah menangkap pengecualian Runtime dengan AOP, tetapi jika segera setelah saya punya waktu, saya akan mempostingnya kembali di sini. - person quantum; 21.05.2012