我有一些传统的罐子,我正试图在弹簧环境中工作。
在我的applicationContext.xml中,我使用:
加载属性文件<context:property-placeholder location="classpath*:META-INF/spring/*.properties" />
......在春天的环境中它完美无缺。
在遗留代码中,我需要获取该配置文件的绝对路径,并且当我运行mvn tomcat:run
并将其打包到war文件并部署到Tomcat容器(在如果你想知道,是的,春天和遗留代码共享相同的application.properties配置文件)。
@Service
public class Startup {
Logger log = LoggerFactory.getLogger(Startup.class);
@PostConstruct
public void startup() throws Exception {
if (!LegacyCode.isInit()){
// this works using a hardcoded path
LegacyCode.init("/home/user/absolute/path/to/application.properties");
// this doesn't work, but would the preferred solution if it did
// LegacyCode.init("classpath*:META-INF/spring/*.properties");
}
}
}
我考虑过使用:
String config[] = { "classpath*:META-INF/spring/applicationContext.xml" };
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
然后使用ctx.getResource劫持路径,但除了第二次加载applicationContext以获取application.properties的绝对路径效率非常低之外,它还会导致@PostConstruct的无限循环被执行。
遗留代码使用Commons Configuration(根据我可以看到并基于依赖性错误)来设置其配置,我正在寻找的是Commons Configuration加载正确的application.properties文件的一种方式,无论它是否正在运行在Linux,Windows,WAR文件或嵌入式Tomcat等
答案 0 :(得分:2)
看起来你的legacyCode想要一个合适的filePath,并且不了解Spring资源("classpath*:META-INF/spring/applicationContext.xml"
)
我个人会做以下事情:
LegacyCode.init(new File(this.getClass().getClassLoader().getResource("application.properties").toURI()).getPath());
getResource("application.properties")
是Java等价的Spring表示法
答案 1 :(得分:0)
在spring上下文中添加此bean
<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer" />
<bean class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer" />
创建类
之后import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
@Configuration
@PropertySource("classpath:mypropfile.properties")
public class Config {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
并注释你的变量
@Value( “$ {cert.path}”) private String certPath;