javascript
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异常分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 生日快乐模板php,可会有人跟我说句生日
- 下一篇: SpringBoot入门教程