2020.8.17
日记
今天开了验收会议。
会议持续时间为10:00-11:40,会上,每个小组从功能的角度展示了一遍各自工作的完成情况(之前的会议是从代码角度展示的),也就是打开网页实际操作一下,然后大家一起讨论分析,经理指出不完善的地方并记录。
会后,各自抓紧时间修改了不完善的地方。
下午14:00,开始完整流程自测。先将数据库的测试数据清空,然后启动测试服务器上发版的war包,打开网页进行测试。先模拟了数据最少的情况,将整个流程测试了一次。基本没有大问题。
之后就准备提交给测试人员正式测试了。
之前遇到的问题
上周五按照计划是应该将项目部署到测试服务器并开始自测的,然而遇到了一个问题:
将项目打成war包上传到服务器并启动时,服务器报错:
org.springframework.beans.factory.BeanCreationException: Error creating bean name 'XXXXXX' defined in VFS resource ["/content/xiangmu.war/WEB-INF/classes/META-INF/app_config/context/context-xxxname.xml"]: Instantiation of bean failed; nested exception is java.lang.ExceptionInInitia lizerError
......
这个错误的意思是说,在你的【context-xxxname.xml】文件中,有一个bean的名字是【XXXXXX】的,无法创建出来;
这是一个自己写的一个初始化bean的xml文件,这些bean是定时任务用的(spring框架下的定时任务)。
出现了问题,就要想办法解决问题,步骤如下:
1.找到是哪个同事写的,让他解决,其他人帮忙;
2.找了半天,发现是这个同事在java中直接用注解注入了mapper.java,然后上测试服务器后就找不到bean了;神奇的是在本地没有问题。
3.由于用到了公司自己封装的spring框架,按照常规,定时任务中应该写构造方法传入service对象(通过service调用mapper),然后在xml中配置service对象(而不是在定时任务java中直接用注解注入mapper对象);因此该同事修改了方法,上测试服务器后就正常了。(至于为什么直接注入mapper.java会找不到bean,还不太清楚。)
关于该问题的分析
这个问题导致自测时间延迟了3天(同事周五加班都没找出来,周日来加班才解决);
这个问题的难点是在本地自测没有问题,只有测试服务器上才报这个错;
关于这个问题的推测:
1.公司封装的spring框架不太好,只能按照规则注入service,从service中调mapper;如果直接注入mapper,在不同环境下可能会发生找不到bean的问题(例如不同tomcat版本、不同jdk版本)
2.本地用的是tomcat,而测试服务器用的是jboss,据说jboss对spring的兼容不是很好,因此当spring中使用xml配置定时任务时,如果配置不得当,可能会出现tomcat下能用、而jboss下不能用的情况。
3.如果不是定时任务的情况下,直接在java中注入mapper也应该是可以的;但如果是在xml中配置了定时任务的形式,有可能在初始化定时任务的bean时,无法从spring容器中获取用到的mapper(在java中用注解注入,此时spring容器还没有将mapper初始化);如果在xml中配置,spring容器就能根据配置内容找到对应类并初始化了。
-------------------------------------------------------------------
后记
这篇文章连我自己都感觉说的不清不楚(因为感觉确实不太清楚问题与解决方法,只是想办法解决了而已)。
本地tomcat下没问题,测试服务器jboss下有问题,这个问题也搞不明白。
得出的结论大致如下:
jboss有可能出现使用注解注入的bean无法create的情况,这时要改为使用构造方法从xml中配置bean的方式。