2014-12-22 4 views
1

У меня есть некоторые устаревшие банки. Я пытаюсь работать внутри весеннего контекста.Найти абсолютный путь к файлу * .properties в контексте Spring

Внутри моей applicationContext.xml, я загружаю файл свойств (ы) с помощью:

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

... и она отлично работает в то время как в контексте пружины.

В устаревшем коде мне нужно получить абсолютный путь к этому конфигурационному файлу, и он должен работать, когда я запускаю mvn tomcat:run, и когда он упакован в военный файл и развернут в контейнер Tomcat (в случае, re, интересно, да, весна, а старый код имеет один и тот же файл конфигурации 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 второй раз только, чтобы получить приложение .properties ', это также вызовет бесконечный цикл работы @PostConstruct.

Унаследованный код использует конфигурацию Commons (насколько я могу видеть и на основе ошибок зависимостей) для настройки своей конфигурации, то, что я ищу, - это способ настройки Commons Configuration для загрузки правильного файла application.properties, независимо от того, работает на Linux, Windows, из файла WAR или из встроенного Tomcat и т.д.

+1

У вас есть несколько файлов свойств в вашем Spring xml, но вы LegacyCode принимают только один? – yunandtidus

+0

Правильно, конфигурация, которая мне нужна для устаревшего материала, сегментирована, поэтому для jar1 мне нужна конкретная конфигурация, а для jar2 мне нужна другая конфигурация, как для настройки Commons Configuration, так и для Spring, ваш ответ выглядит так, как будто бы это сделало работу , проверит немного и вернет вам ответ. –

ответ

2

кажется, что вы legacyCode хочет надлежащего Filepath, и не понимает пружине ресурсов ("classpath*:META-INF/spring/applicationContext.xml")

Я personnaly бы сделать следующие:

LegacyCode.init(new File(this.getClass().getClassLoader().getResource("application.properties").toURI()).getPath()); 

getResource("application.properties") является Java эквивалентом Spring нотации

+0

Works 100%, это то, что я в конце концов:.. LegacyCode.init (новый файл (this.getClass() getClassLoader() getResource ( \t \t \t \t "META-INF/весна/application.properties") .toURI()) GetPath()). Спасибо yunandtidus !! –

0

В контексте ярового добавить эту фасоль

<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;

Смежные вопросы