Rumah  >  Soal Jawab  >  teks badan

Bagaimana untuk log pengecualian pada tahap @Transaction Spring?

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 log Tetapi 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 mencerminkan invoke() Pengendalian pengecualian adalah dilakukan dalam kaedah try 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 tahap service, dan tidak mahu membuang rekod log di atas.

某草草某草草2691 hari yang lalu639

membalas semua(2)saya akan balas

  • 伊谢尔伦

    伊谢尔伦2017-06-06 09:53:47

    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);
            ...
        }
    }

    balas
    0
  • 世界只因有你

    世界只因有你2017-06-06 09:53:47

    Spring juga menyediakan pengendalian pengecualian aspek

    <!--aop配置 -->
        <aop:config>
            <!-- 业务类切面 -->
            <aop:pointcut id="【切面ID】"
                expression="【这里填写切面的匹配规则】" />
            <!-- 异常处理 -->
            <aop:aspect ref="【处理异常的类ID】">
                <aop:after-throwing method="【处理异常的方法名称】" pointcut-ref="【切面ID】" throwing="e" />
            </aop:aspect>
        </aop:config>

    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

    balas
    0
  • Batalbalas