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

本文介绍了一个Maven多模块项目中配置文件读取的问题及解决方案。问题表现为在JUnit测试环境下能正常读取配置文件,但在实际业务代码中读取失败。文章详细分析了不同文件读取方式在多模块项目中的表现,并给出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

记录下来以备参考。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值