亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

java - 如何在Spring的@Transaction層面上對異常進行日志記錄?

瀏覽:80日期:2022-06-11 18:12:57

問題描述

在沒使用@Transaction之前,我的業務代碼模型大概就是下面這樣:

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;

類似上面這樣的話不管我上面的數據庫操作執行成功還是執行失敗,我在日志中都可以得到反饋。

但是上面這樣的做法,會造成大量的代碼的重復,利用spring提供的aop可以實現這樣的日志功能,但是后來看文檔發現有一個@Transaction注解,使用這個注解,代碼可以簡化成下面這個樣子:

@Transactional(rollbackFor = Exception.class) public boolean insertOneStudent(Student student) {studentMapper.insertOneStudent(student);logger.info('Insert one student successfully' + student.toString());return true; }

這樣當數據庫操作執行成功的時候我可以日志中成功的進行記錄,但是這樣的話當插入操作執行失敗的時候我應該如何在日志中進行記錄。

我現在的初步想法是自己手動實現一個類似@Transaction的動態反射的功能,這樣每個要影響數據庫中的數據修改的方法執行的時候我都在動態反射的invoke()方法中進行異常的try catch的處理。但是不知道spring是否內置這樣的功能?

p.s: 我盡量想將數據庫的操作與處理全部放在service層面來處理,不想將日志記錄的往上面拋。

問題解答

回答1:

insertOneStudent方法整個try catch

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

或者實現@RestControllerAdvice,在里面統一打印異常日志像這樣:

@RestControllerAdvicepublic class MyExceptionHandler { @ExceptionHandler(value = Exception.class) public Object exceptionHandler(HttpServletRequest request, Exception exception) {logger.warn('異常:', exception);... }}回答2:

spring也有提供切面的異常處理

<!--aop配置 --> <aop:config><!-- 業務類切面 --><aop:pointcut expression='【這里填寫切面的匹配規則】' /><!-- 異常處理 --><aop:aspect ref='【處理異常的類ID】'> <aop:after-throwing method='【處理異常的方法名稱】' pointcut-ref='【切面ID】' throwing='e' /></aop:aspect> </aop:config>

當然,有xml配置就會有注解配置。主要有下面幾個注解

@Aspect 聲明切面配置

@Pointcut 聲明切面

@AfterThrowing 聲明處理方法

注意事項:

處理異常的類是不需要實現任何接口和繼承任何類的。

處理異常的方法要聲明兩個參數(不聲明也可以,獲取不了異常信息而已),舉個例子

public void test(JoinPoint joinPoint, Exception e)

其中joinPoint參數可以獲取拋出異常的方法參數信息,Exception對象就不用說了吧。

以上內容僅做參考,spring的版本不同也可能會導致上述說明和實際情況有差異,想獲取標準的說明請參閱Spring的官方文檔

相關文章:
主站蜘蛛池模板: 国产a不卡片精品免费观看 国产a毛片高清视 | 国产在线一区二区三区欧美 | 成人黄色片网站 | 欧美三级在线看中文字幕 | 黄色毛片在线 | 亚洲夂夂婷婷色拍ww47 | 大量国产后进翘臀视频 | 久久久久女人精品毛片九一 | 欧美成人精品一区二三区在线观看 | 国产一级特黄在线播放 | 天天怕夜夜怕狠狠怕 | 亚洲一区二区约美女探花 | 后式大肥臀国产在线 | 特级全黄大片 | 国产在线观看人成激情视频 | 婷婷六月久久综合丁香可观看 | 免费观看黄色网址 | 久久青草免费91观看 | 青青国产成人久久91 | 国内自拍在线视频高清 | 欧美一区二区三区婷婷月色 | 国产一区二区高清视频 | 九九久久久久午夜精选 | 欧美性黄色 | 一级毛片视频在线观看 | 久久一本色系列综合色 | 久久国产精品自由自在 | 黄址在线观看 | 国产亚洲精品一区在线播 | 日韩在线视频网 | 精品五夜婷香蕉国产线看观看 | 国产成人久久精品一区二区三区 | 天堂亚洲欧美日韩一区二区 | 国产精品亚洲精品不卡 | 91久久国产综合精品女同国语 | 精品欧美一区二区三区在线 | 亚洲欧美中文在线观看4 | 日韩欧美一级毛片在线 | 日韩在线观看网址 | 国产成人精品视频一区 | 在线91精品亚洲网站精品成人 |