Bagaimana untuk log pengecualian pada tahap @Transaction Spring?
某草草
某草草 2017-06-06 09:51:47
0
2
605

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@Transactionanotasi 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.

某草草
某草草

membalas semua (2)
伊谢尔伦

insertOneStudent kaedah keseluruhan try catch

try { ... } catch (Exception e) { logger.error(e.getMessage(), e); throw e; }

Atau laksanakan @RestControllerAdvice dan cetak log pengecualian di dalamnya
Seperti ini:

@RestControllerAdvice public class MyExceptionHandler { @ExceptionHandler(value = Exception.class) public Object exceptionHandler(HttpServletRequest request, Exception exception) { logger.warn("异常:", exception); ... } }
    世界只因有你

    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:

    1. Kelas yang mengendalikan pengecualian tidak perlu melaksanakan sebarang antara muka atau mewarisi mana-mana kelas.

    2. Kaedah pengendalian pengecualian perlu mengisytiharkan dua parameter (anda juga tidak boleh mengisytiharkannya, maklumat pengecualian tidak boleh diperolehi), contohnya

      public void test(JoinPoint joinPoint, Exception e)

      Parameter joinPoint boleh mendapatkan maklumat parameter kaedah yang melemparkan pengecualian.

    3. 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

      Muat turun terkini
      Lagi>
      kesan web
      Kod sumber laman web
      Bahan laman web
      Templat hujung hadapan
      Tentang kita Penafian Sitemap
      Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!