Spring3.x版本+maven多模块读取配置文件properties一直是null的坑
程序员文章站
2022-05-25 10:30:20
...
问题描述一下:JUnit测试的时候文件读取正常,可以获取数据,但是在实际业务代码里面(Controller、Service)获取配置文件的时候提示的是NULL,异常代码是file does not exist之类的。
背景,维护的是公司遗留的一个老项目(各种坑啊,而且当时开发的人是最基本的规范都不遵守的那种),功能是一个文件上传,文件保存的路径是写死在代码里面,系统部署的时候是多节点,需要同步路径,非常麻烦,所以改成读取配置文件。
框架用的是Spring 3.2.4.RELEASE版本,maven配置的多模块。
先贴一下代码:(测试类代码)
package com.egintra.knowledge.test;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Optional;
import java.util.Properties;
import org.junit.Before;
import org.junit.Test;
import org.springframework.core.io.ClassPathResource;
public class PropertiesFileTest {
@Before
public void setUp() throws Exception {
}
@Test
public void test() {
ClassPathResource resource = new ClassPathResource("config/file.properties");
Properties properties = new Properties();
try {
// PS:使用resource.getFile(),单元测试可以正常获取,但是在业务代码中获取为null,原因请看后面说明。
// properties.load(new FileInputStream(resource.getFile()));
// 单元测试和业务代码都可以正常获取文件
properties.load(resource.getInputStream());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 获取内容,略...
String imagePrefix = (String) Optional.ofNullable(properties.get("image.prefix"))
.orElse("http://127.0.0.1:8113...");
System.out.println(imagePrefix);
}
}
Spring版本太低,不能用@Value注解获取,Spring3获取配置文件的方式有好几种,其余方式没有测试过是否存在同样问题。
我的这个方式,在测试类里面获取正常,但是就在实际业务代码里面通过这个方式获取不到配置文件。后来参考了网上的一篇文章才找到问题所在,浏览器清空过缓存,原地址找不到了。
问题的原因是maven多模块引用的时候是通过jar包的方式,如果代码是在jar里面,直接通过“resource.getFile()”这个方式是获取不到文件(大约和文件读取权限范围有关,具体原因不清楚,有知道的请不吝赐教,谢谢。),需要使用“resource.getInputStream()”的方式才能读到。
而我代码里面一开始测试用的就是ResourceUtils读取的file,
File file = ResourceUtils.getFile("classpath:config/file.properties");
后来改成ClassPathResource
ClassPathResource resource = new ClassPathResource("config/file.properties");
但是都是传的file,所以一直是测试中正常,业务中读不到的问题。
记录下来以备参考。