这个问题,折腾了2天的时间终于解决了!!! 特此记录,并且分享解决问题的思路和解决的办法。
将SSH框架搭建的项目放在测试环境运行的时候,出现错误:
Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException
从错误的信息可以看到是创建‘sessionFactory’出现错误,并且是NullPointerException,第一直觉就是数据库连接的信息错了,然后就是检查对应的数据库的连接的username,password,url这些,但是就是一直报错,实在看不出来有什么错误,然后找度娘进行查找,也没有找到解决办法,然后Google,给出的解决的方案是jar冲突造成的,我看了我的lib,有很多的重复的jar,并且使用的struts2和hibernate都非常老,hibernate 3和struts2-2.3.2 这个版本的,Google上很多答案是表示hibernate3有问题,但是我这个应该不是这个原因,因为生产环境都是没问题的,最后,经过重重的排查,和2天时间的去思考,终于解决了问题!!!
下面给出我解决问题的思路和办法,已经出现这个问题的解决的其他的方法:
1.第一个原因:出现这个问题的根源是sessionFactory创建失败,一般的问题是使用的hibernate,则entity和对应的数据表的映射问题,如果你用的hbm.xml则检查xml中的映射是否一致(注意大小写),如果使用的注解,则检查@Column(name="xx")中对应的数据表的字段,同样注意大小写。检查数据的连接的URL,username,password这些基本的就很直接的。
2.第二个原因:项目中的jar包的问题,有可能jar包出现冲突和这个版本的jar是有问题的,所以去lib下看看是否是jar的问题。比如hibenrate和spring以及struts2整合的时候,其中spring的:asm-commons-2.2.2.jar,asm-util-2.2.2.jar,asm-2.2.2.jar和hibernate的asm.jar,asm-attrs.jar,则asm-2.2.2.jar和asm.jar出现冲突。所以排查一个jar的冲突。
3.第三个原因:这个原因就是我出现的问题之一,上面出现的问题都不能解决我遇到的这个问题,然后只能自己去一点点去排查了,因为MAC的换行符是CR,而测试环境是windows,换行符是CRLF,所以会出现jdbc.properties的格式出现问题,导致无法解析。
4.第四个原因:这个原因是我解决了问题的主要原因,虽然解决了格式问题,但是依然报错,NullPoniterException很奇葩,然后只能一点点的去看,出现这个问题,出现这个问题如果不是字段映射的问题,应该就是DataSource的问题,所以去检查DataSource,结果发现项目中使用到的DataSource的class不是第三方的dataSource,而是自定义的DataSource,然后我仔细查看了这个自定义的DataSource,发现 里面的方法居然会对数据库的连接的password进行一个解密的操作,看到这,我就知道问题终于可以解决问题了,查看原本的jdbc.properties的password的配置,发现果然是一个加密之后的字符串,所以我尝试使用dbcp的DataSource,并导入commons-dbcp-1.2.2.jar和commons-pool-1.3.jar 这两个就可以了,然后改变DataSource引用的class,然后运行,成功!!! 终于没有报错。
贴出来我修改成功之后的配置:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${db.driver}"/>
<property name="url" value="${db.url}"></property>
<property name="username" value="${db.user}"/>
<property name="password" value="${db.password}"></property>
</bean>
看来还是不能一直找度娘,还是要先自己思考问题的原因...... ,要不然我也不需要花这么多时间