Sebelum menggunakan@Transaction
, model kod perniagaan saya mungkin seperti berikut:
DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(def); try { studentMapper.insertOnestdent(student); logger.info("Insert one record successfully: " + student.toString()); } catch (Exception ex) { dataSourceTransactionManager.rollback(transactionStatus); // ex.printStackTrace(); logger.error("Insert one record unsuccessfully: " + student.toString()); return false; } dataSourceTransactionManager.commit(transactionStatus); return true;
Sama seperti di atas, tidak kira sama ada operasi pangkalan data saya di atas dilaksanakan dengan jayanya atau gagal, saya boleh mendapatkan maklum balas dalam log.
Tetapi pendekatan di atas akan menyebabkan banyak pertindihan kod Anda boleh menggunakan aop yang disediakan oleh spring untuk melaksanakan fungsi pengelogan tersebut, namun selepas membaca dokumen tersebut, saya mendapati terdapat@Transaction
anotasi ini kod boleh dipermudahkan kepada perkara berikut:
@Transactional(rollbackFor = Exception.class) public boolean insertOneStudent(Student student) { studentMapper.insertOneStudent(student); logger.info("Insert one student successfully" + student.toString()); return true; }
Dengan cara ini, apabila operasi pangkalan data dilaksanakan dengan jayanya, saya berjaya merekodkannya dalam logTetapi dalam kes ini, bagaimanakah saya perlu merekodkannya dalam log apabila operasi memasukkan gagal?
Idea awal saya sekarang ialah melaksanakan secara manual fungsi pantulan dinamik yang serupa dengan@Transaction
的动态反射的功能,这样每个要影响数据库中的数据修改的方法执行的时候我都在动态反射的invoke()
方法中进行异常的try catch
, supaya apabila setiap kaedah yang mempengaruhi pengubahsuaian data dalam pangkalan data dilaksanakan, saya akan secara dinamik mencerminkaninvoke()
Pengendalian pengecualian adalah dilakukan dalam kaedahtry catch
.Tetapi saya tidak tahu sama ada spring mempunyai fungsi terbina dalam sedemikian?
p.s: Saya cuba yang terbaik untuk mengendalikan semua operasi dan pemprosesan pangkalan data pada tahapservice
, dan tidak mahu membuang rekod log di atas.
insertOneStudent kaedah keseluruhan try catch
Atau laksanakan @RestControllerAdvice dan cetak log pengecualian di dalamnya
Seperti ini:
Spring juga menyediakan pengendalian pengecualian aspek
Sudah tentu, jika ada konfigurasi xml, akan ada konfigurasi anotasi. Terdapat terutamanya komen berikut
@Aspect mengisytiharkan konfigurasi aspek
@Pointcut mengisytiharkan aspek
@AfterThrowing kaedah pemprosesan pengisytiharan
Nota:
Kelas yang mengendalikan pengecualian tidak perlu melaksanakan sebarang antara muka atau mewarisi mana-mana kelas.
Kaedah pengendalian pengecualian perlu mengisytiharkan dua parameter (anda juga tidak boleh mengisytiharkannya, maklumat pengecualian tidak boleh diperolehi), contohnya
Parameter joinPoint boleh mendapatkan maklumat parameter kaedah yang melemparkan pengecualian.
Kandungan di atas adalah untuk rujukan sahaja. Versi spring yang berbeza mungkin menyebabkan arahan di atas berbeza daripada keadaan sebenar untuk arahan standard, sila rujuk dokumentasi rasmi Spring