1

我有一些遗留的罐子,我正试图在 spring 环境中工作。

在我的 applicationContext.xml 中,我使用以下方法加载属性文件:

<context:property-placeholder location="classpath*:META-INF/spring/*.properties" />

...而且它在春季环境中完美运行。

在遗留代码中,我需要获取该配置文件的绝对路径,它应该在我运行mvn tomcat:run时以及将其打包到 war 文件并部署到 Tomcat 容器时工作(如果您想知道,是的, spring 和遗留代码共享相同的 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 等。

4

2 回答 2

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")是 Spring 表示法的 Java 等价物

于 2014-12-22T16:00:32.910 回答
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}") 私有字符串 certPath;

于 2014-12-24T15:42:12.803 回答