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     }

 

折腾了好久终于弄好了一个小小的问题。

 

初次写博,请多关照,恳请大佬们批评指教。

 

posted on 2020-08-07 13:16  清云岸  阅读(1131)  评论(1)    收藏  举报

导航