javaConfig方式在SSM过程中整合Redis 添加redis_config.properties中出现的配置文件读取不到的问题解决
在进行SSM整合Redis的过程中,需要读取redis_config.properties文件,以便进行redis的配置,但是实现过程中,出现了配置文件始终读取不到的问题,RootConfig.java中有关代码如下:
1 private static Properties p;
2 static { 3 p = new Properties(); 4 try { 5 p.load(new FileInputStream( "src/main/resources/redis_config.properties")); 6 } catch (IOException e) { 7 e.printStackTrace(); 8 } 9 }
报错如下:
java.io.FileNotFoundException: src\main\resources\redis_config.properties (系统找不到指定的路径。)
随后就开始进行了日常的找错之旅...
所写的项目结构如下:

一、试着读取路径
将File文件单独进行寻找,并输出其路径,代码如下:
File file=new File("src/main/resources/redis_config.properties"); System.out.println(file.getAbsolutePath()); System.out.println(System.getProperty("user.dir"));
操作台得到的结果如下所示:
F:\tomcat\apache-tomcat-9.0.30\bin\src\main\resources\redis_config.properties
F:\tomcat\apache-tomcat-9.0.30\bin
显而易见,所获取到的路径,并不是我所想的能获取到javaconfig_ssm下的src\main\resources路径,思考出现这样问题的原因。
(以下是个人理解,可能有误,恳请指正)
因为是通过javaConfig的方式进行SSM整合,项目首先是加载在Tomcat下,Tomcat自动匹配继承AbstractAnnotationConfigDispatcherServletInitializer类的java文件进行相关配置。
而Tomcat运行时的ClassPath是Tomcat自己的文件夹路径,如图:

因此,直接在Spring初始化阶段自动配置运行的RootConfig中,进行File的读取,读取到Tomcat的ClassPath也就不奇怪了。
我这边采用src/main/resources/redis_config.properties进行配置文件的读取是因在后续的SqlSessionFactory配置中,如图所示,使用了类似的路径进行xml文件的读取,但是很明显,两个方法有很大的差别,具体哪些差别后面有空仔细看看源码再继续分析。

2、查询资料,找解决办法
①检查IDEA 的Content Root设置 (Content Root 原理参考文献: https://blog.csdn.net/zx48822821/article/details/78640041)

检查无误,排除Content Root设置错误文件都没被当作配置文件加载的可能。
②IDEA 的target文件夹下有没有该配置文件
经检查,是确实存在的,而且用别的方式读取的配置文件也可以正常使用。
(p.s.当时还想尝试修改读取配置文件时的默认路径,但是失败了,可能自己无知无畏...)
3、放弃直接设置路径的方式进行properties文件的寻找,转变思路
在直接设置路径等方面,查询了很多资料,并没有找到合适的解决办法,于是我又双叒叕开始进行新的思考,把这一条语句拆分几步,能不能先把文件进行获取到,再进行文件流的读取,最后进行Properties的load操作呢?
①看到File()在1.8中有多种构造方法,其中就有uri的构造方法

那接下来就只需要找到文件的绝对路径,并进行File对象的创建,就可以实现我想实现的功能。
②使用ClassLoader进行文件的查找,找到文件后进行Properties的文件流加载 (底层原理参考:https://blog.csdn.net/zhangshk_/article/details/82704010)
1 ClassLoader classLoader = Class.forName(RootConfig.class.getName()).getClassLoader(); 2 URL url = classLoader.getResource("redis_config.properties"); 3 File redisConfigFile = new File(url.getFile());
③大功告成
最后,果不其然,获取到了该配置文件,后续进行配置文件的读取和加载时,不再报错。
观察运行过程中路径的输出结果:
F:\tomcat\apache-tomcat-9.0.30\webapps\javaconfig_ssm_war\WEB-INF\classes\redis_config.properties
F:\tomcat\apache-tomcat-9.0.30\bin
最后附上这部分修改过后的源代码:
1 private static Properties p; 2 3 static { 4 p = new Properties(); 5 try { 6 ClassLoader classLoader = Class.forName(RootConfig.class.getName()).getClassLoader(); 8 /** 9 getResource()方法会去classpath下找这个文件,获取到url resource, 得到这个资源后,调用url.getFile获取到 文件 的绝对路径 10 */ 11 URL url = classLoader.getResource("redis_config.properties"); 12 /** 13 * url.getFile()获取绝对路径 通过绝对路径获取File对象 14 */ 15 File redisConfigFile = new File(url.getFile()); 16 /** 17 * 输出并观察绝对路径 18 */ 19 System.out.println(redisConfigFile.getAbsolutePath()); 20 System.out.println(System.getProperty("user.dir")); 21 /** 22 * 将文件读入输入流中,Properties进行加载读取 23 */ 24 InputStream input = new FileInputStream(redisConfigFile); 25 p.load(input); 26 } catch (ClassNotFoundException e) { 27 e.printStackTrace(); 28 } catch (FileNotFoundException e) { 29 e.printStackTrace(); 30 } catch (IOException e) { 31 e.printStackTrace(); 32 } 33 }
折腾了好久终于弄好了一个小小的问题。
初次写博,请多关照,恳请大佬们批评指教。
浙公网安备 33010602011771号