日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Boot————BeanCreationNotAllowedException异常分析

發布時間:2025/3/12 javascript 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Boot————BeanCreationNotAllowedException异常分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引言

在對數據庫進行新增記錄的JUnit測試時,拋出一個BeanCreationNotAllowedException異常:

異常分析與解決

異常信息太長,圖片截不下,粘貼來看:

Exception in thread "pool-2-thread-1" org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'redisConnectionFactory': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)?

異常代碼:

@Testpublic void testAddOrUpdateUser() throws InterruptedException {JSONObject teacher = new JSONObject();teacher.put("role", "teacher");teacher.put("teacherName", "王力宏");teacher.put("jobTitle", "助理教授");teacher.put("gender", "男");teacher.put("username", "wanglihong");SystemResult addOrUpdateUser = userService.addOrUpdateUser(teacher);System.out.println(addOrUpdateUser);}

?測試方法的關鍵調用函數是:userService.addOrUpdateUser(teacher); 可是在這個方法內部完全沒有用到redis的相關內容,而且奇怪的是:用debug模式運行方法的話完全可以成功

莫名其妙!

來看一下addOrUpdateUser方法:

@Override@SuppressWarnings("rawtypes")public SystemResult addOrUpdateUser(Object user) {Boolean isTeacher = checkSvc.checkTeacherByRole(user);boolean isStudent = !isTeacher;String userStr = null;Class clazz = null;if (isTeacher) {// 添加教師Teacher teacher = JSONObject.toJavaObject(JSONObject.parseObject(JSONObject.toJSONString(user)),Teacher.class);DBProcessor.execute(() -> {tchrRep.save(teacher);});// ......} else if (isStudent) {// ......}logger.info("添加或更新<" + clazz.getSimpleName() + "> : " + userStr);String resultMessage = "添加或更新" + (isTeacher ? "教師" : "學生") + "成功!";return new SystemResult(SysContents.SUCCESS, resultMessage, clazz.getSimpleName().toLowerCase());}

我已經簡化了部分代碼,關鍵就是執行save方法的前后,可以看出此處的save方法,我為了充分利用并發性,采用了多線程的方式,將保存任務交給了一個ExecutorService——DBProcessor去執行。

交給一個新的線程去執行就是問題所在!

其實,細致分析一下就可以發現,我們采用debug的方式,或者將任務不交給線程去執行,而是串行直接執行任務,就不會有問題,原因就是,分配新的線程執行任務需要一定的性能和時間開銷,因此會稍微比JUnit測試方法延遲一些。這樣當JUnit方法執行完成立刻退出之后,整個系統環境也就直接退出關閉,沒有給新的線程足夠的時間去執行任務,因此才會導致插入失敗。

順著這個思路,我在JUnit方法執行到addOrUpdateUser之后sleep 1秒鐘,果然順利通過測試。

至于異常所描述的創建bean失敗,我想就是因為JUnit測試結束之后過早退出系統環境的原因。

另外,這個問題網上的出錯原因也并不一致,還要根據自己的問題具體分析。

如有疑問,歡迎留言。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Spring Boot————BeanCreationNotAllowedException异常分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。