Spring3.x版本+maven多模块读取配置文件properties一直是null的坑

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

记录下来以备参考。

 

 

 

 

你可能感兴趣的:(知新)