欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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,所以一直是测试中正常,业务中读不到的问题。

记录下来以备参考。