解决JDBC在web工程中无法获取配置文件
一、错误描述
在javaweb项目中,通过前端页面发送表单数据到Servlet程序并进行插入数据到数据库中的操作时,出现空指针异常,如下图所示:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PH4rDZtg-1647776851722)(img.assets/%E7%B4%A0%E6%9D%901-16471639870341.png)]](https://img-blog.csdnimg.cn/ba80d9eeeca1420aa68c48e07cb4ed76.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA4piGKuW-gOS6i-maj-miqCrimIY=,size_20,color_FFFFFF,t_70,g_se,x_16)
通过异常信息,我们可以发现,是我们的 JDBCUtiles 类出现了异常,那么我们对JDBCUtiles 进行 debug 调试,发现是数据库连接出现了问题:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uZEy82yQ-1647776851723)(img.assets/image-20220313173721707.png)]](https://img-blog.csdnimg.cn/6f3a964d3e1545a1b55a66f014a3a917.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA4piGKuW-gOS6i-maj-miqCrimIY=,size_20,color_FFFFFF,t_70,g_se,x_16)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7TEh7r6q-1647776851724)(img.assets/image-20220313173745065-16471642676092.png)]](https://img-blog.csdnimg.cn/1956f384aa6b4dfd96e9d9f8c7371f27.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA4piGKuW-gOS6i-maj-miqCrimIY=,size_20,color_FFFFFF,t_70,g_se,x_16)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fC17rrHm-1647776851724)(img.assets/image-20220313173851795-16471643335153.png)]](https://img-blog.csdnimg.cn/1bdb6611e5454fefac1c1262241f56a4.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA4piGKuW-gOS6i-maj-miqCrimIY=,size_20,color_FFFFFF,t_70,g_se,x_16)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-maIBDP4a-1647776851725)(img.assets/image-20220313173948084-16471643898504.png)]](https://img-blog.csdnimg.cn/a04faf33e7044e6dbed4874b2c8613d6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA4piGKuW-gOS6i-maj-miqCrimIY=,size_20,color_FFFFFF,t_70,g_se,x_16)
从上面的debug信息我们可以看到,我们的配置文件获取值为null,进而导致我们的数据库连接为 null ,出现这一现象的主要原因是我们的配置文件没有获取到
二、解决方案
- 首先检查配置文件的位置是否正确,我这里是没有问题的
- 其次看一下我这里使用的获取配置文件的方式:
static{
try {
Properties properties = new Properties();
InputStream resourceAsStream = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
properties.load(resourceAsStream);
source1 = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
上边这种获取方式采用的是 静态代码块 + 系统类加载器 的方式来获取配置文件,但是在我们的javaweb项目部署过程中文件目录可能会发生变化,所以这种方式可能会获取不到配置文件,所以我们可以 将 系统类加载器 修改为 当前类加载器 ,如下所示:
static{
try {
Properties properties = new Properties();
InputStream resourceAsStream = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
properties.load(resourceAsStream);
source1 = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
修改完成之后重启服务,即可解决此问题。
|