国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

java - 如何在Spring的@Transaction層面上對(duì)異常進(jìn)行日志記錄?

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

問(wèn)題描述

在沒(méi)使用@Transaction之前,我的業(yè)務(wù)代碼模型大概就是下面這樣:

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;

類(lèi)似上面這樣的話不管我上面的數(shù)據(jù)庫(kù)操作執(zhí)行成功還是執(zhí)行失敗,我在日志中都可以得到反饋。

但是上面這樣的做法,會(huì)造成大量的代碼的重復(fù),利用spring提供的aop可以實(shí)現(xiàn)這樣的日志功能,但是后來(lái)看文檔發(fā)現(xiàn)有一個(gè)@Transaction注解,使用這個(gè)注解,代碼可以簡(jiǎn)化成下面這個(gè)樣子:

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

這樣當(dāng)數(shù)據(jù)庫(kù)操作執(zhí)行成功的時(shí)候我可以日志中成功的進(jìn)行記錄,但是這樣的話當(dāng)插入操作執(zhí)行失敗的時(shí)候我應(yīng)該如何在日志中進(jìn)行記錄。

我現(xiàn)在的初步想法是自己手動(dòng)實(shí)現(xiàn)一個(gè)類(lèi)似@Transaction的動(dòng)態(tài)反射的功能,這樣每個(gè)要影響數(shù)據(jù)庫(kù)中的數(shù)據(jù)修改的方法執(zhí)行的時(shí)候我都在動(dòng)態(tài)反射的invoke()方法中進(jìn)行異常的try catch的處理。但是不知道spring是否內(nèi)置這樣的功能?

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

問(wèn)題解答

回答1:

insertOneStudent方法整個(gè)try catch

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

或者實(shí)現(xiàn)@RestControllerAdvice,在里面統(tǒng)一打印異常日志像這樣:

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

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

<!--aop配置 --> <aop:config><!-- 業(yè)務(wù)類(lèi)切面 --><aop:pointcut expression='【這里填寫(xiě)切面的匹配規(guī)則】' /><!-- 異常處理 --><aop:aspect ref='【處理異常的類(lèi)ID】'> <aop:after-throwing method='【處理異常的方法名稱(chēng)】' pointcut-ref='【切面ID】' throwing='e' /></aop:aspect> </aop:config>

當(dāng)然,有xml配置就會(huì)有注解配置。主要有下面幾個(gè)注解

@Aspect 聲明切面配置

@Pointcut 聲明切面

@AfterThrowing 聲明處理方法

注意事項(xiàng):

處理異常的類(lèi)是不需要實(shí)現(xiàn)任何接口和繼承任何類(lèi)的。

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

public void test(JoinPoint joinPoint, Exception e)

其中joinPoint參數(shù)可以獲取拋出異常的方法參數(shù)信息,Exception對(duì)象就不用說(shuō)了吧。

以上內(nèi)容僅做參考,spring的版本不同也可能會(huì)導(dǎo)致上述說(shuō)明和實(shí)際情況有差異,想獲取標(biāo)準(zhǔn)的說(shuō)明請(qǐng)參閱Spring的官方文檔

相關(guān)文章:
主站蜘蛛池模板: 偷自拍第一页 | 久久精品亚瑟全部免费观看 | 亚洲国产日韩综合久久精品 | 中文字幕亚洲另类天堂 | 久久伊人成人网 | 九九九精品视频 | 日本免费一区二区三区毛片 | 欧美生活片在线 | 久章草视频 | 国产亚洲精品一区二区在线播放 | 免费人成在线观看网站视频 | 狠色狠狠色狠狠狠色综合久久 | 在线观看一二三区 | 国产精品视频久久久久 | 亚洲中文字幕特级毛片 | 成人做爰网站免费看 | 91理论片午午伦夜理片久久 | 国产在线观看精品一区二区三区91 | 成人性毛片 | 精品亚洲成a人在线播放 | 久久久久亚洲精品一区二区三区 | 欧美第一视频 | 国产午夜亚洲精品国产 | 久久88香港三级台湾三级中文 | 日韩一级欧美一级 | 亚洲羞羞视频 | 九九成人免费视频 | 成人小视频在线观看 | 日本高清色本免费现在观看 | 免费男女乱淫真视频播放 | 中日韩精品视频在线观看 | 99福利网 | 日本japanesevideo黑人 | 欧美精品亚洲精品日韩专区 | 丁香狠狠色婷婷久久综合 | 精品久久香蕉国产线看观看亚洲 | 一级生性活免费视频 | 性欧美视频a毛片在线播放 性欧美一级 | 在线观看 一区 | 国产一级做a爰片久久毛片男 | 国产成人精品系列在线观看 |