2012-07-31 6 views
5

Potrzebuję ustawień rozwojowych i produkcyjnych dla naszego projektu wiosennego. Rozumiem, że możesz używać profili na wiosnę, ale to nie jest coś, co możemy zrobić.Wczytanie aplikacji spring.properties na podstawie definicji kontekstu servletu tomcat

Co chcę zrobić, to umieścić w środowisku programistycznym plik test-application.properties i na produkcji plik prod-application.properties. W definicji kontekstu tomcat wysłaliśmy:

<Context> 
    <context-param> 
     <param-name>properties_location</param-name> 
     <param-value>file:C:\Users\Bill\test-application.properties</param-value> 
    </context-param> 
</Context> 

Możemy zmienić wartość dla serwerów produkcyjnych. W config wiosny mamy coś takiego:

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>${properties_location}</value> 
     </list> 
    </property> 
    <property name="ignoreUnresolvablePlaceholders" value="false" /> 
</bean> 

Ale wciąż otrzymuję błędów takich jak:

org.springframework.beans.factory.BeanInitializationException: Czy nie załadować właściwości; wyjątek zagnieżdżonych jest java.io.FileNotFoundException: Nie można otworzyć ServletContext zasób [/ $ {properties_location}]

Wszelkie pomysły, jak rozwiązać?

Odpowiedz

8

Jedną z funkcji PropertyPlaceholder jest możliwość definiowania wielu lokalizacji zasobów. Tak na przykład można zdefiniować your-production-config.properties wraz z pliku: C:/Users/$ {user.name} /test-application.properties

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>classpath:your-production-config.properties</value> 
      <value>file:C:/Users/${user.name}/test-application.properties</value> 
     </list> 
    </property> 
    <property name="ignoreUnresolvablePlaceholders" value="true"/> 
    <property name="ignoreResourceNotFound" value="true"/> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>   
</bean> 

do produkcji trzeba umieszczać konfigurację prod gdzieś w ścieżce classpath) - dla lokalnego środowiska możesz użyć komendy podobnej do tego pliku: C:/Users/$ {user.name} /test-application.properties

+0

Zrobiłem to samo, ale zapomniałem o ignoreResourceNotFound. Teraz działa. Dziękuję za odpowiedź! – checklist

+0

Ponadto, ponieważ wskazano SYSTEM_PROPERTIES_MODE_OVERRIDE, wszelkie właściwości określone przez parametr -D w wywołaniu java zastąpią to, co znajduje się w pliku właściwości, dlatego pierwszeństwo ma "java -Duser.name = ted ...". W przypadku ignoreResourceNotFound pliki właściwości mogą być opcjonalnie nieobecne bez rzucania wyjątku. –

0

zastosowanie:

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>C:/Users/Bill/test-application.properties</value> 
     </list> 
    </property> 
    <property name="ignoreUnresolvablePlaceholders" value="false" /> 
</bean> 

Usuń poniżej kod z web.xml

<Context> 
    <context-param> 
     <param-name>properties_location</param-name> 
     <param-value>file:C:\Users\Bill\test-application.properties</param-value> 
    </context-param> 
</Context> 
+0

Chodzi mi o to, aby lokalizacja pliku właściwości znajdowała się poza plikiem wojny, więc nie można go umieścić w definicji fasoli. Dzięki – checklist

1

I skończył rozwiązywania go nie używając kontekstu params. Zamiast tego zdefiniowaliśmy

W ten sposób spróbujesz załadować oba pliki. Na serwerach testowych nie mamy pliku prod, więc nie jest załadowany. Na serwerze prod istnieje plik prod-application.properties i nadpisuje test znajdujący się w ścieżce klasy. Cumbersome, ale działa!

+0

Chociaż to działa, byłoby miło, gdyby wiosna miała lepsze rozwiązanie. Jestem pewien, że wiele osób wdraża aplikacje do tomcat i chce uzewnętrznić rekwizyty – checklist

1

Osobiście staram się unikać określania lokalizacji. Myślę, że najlepiej jest użyć JNDI, aby to osiągnąć.

w Tomcat/conf/server.xml

<Resource name="jdbc/prod" auth="Container" 
      type="javax.sql.DataSource" driverClassName="${database.driverClassName}" 
      url="${database.url}" 
      username="${database.username}" password="${database.password}" 
      maxActive="20" maxIdle="10" 
      maxWait="-1"/> 

i Tomcat catalina.properties (W przypadku korzystania z Oracle XE inaczej zmienić go odpowiednio):

database.driverClassName=oracle.jdbc.driver.OracleDriver 
database.url=jdbc:oracle:thin:@//localhost:1521/XE 
database.username=user 
database.password=password 

W aplikacji tworzyć właściwości w pliku twoja ścieżka klasy o nazwie jdbc.właściwości i umieścić następne (W przypadku korzystania z Oracle XE inaczej zmienić go odpowiednio)

jdbc.driverClassName=oracle.jdbc.driver.OracleDriver 
jdbc.url=jdbc:oracle:thin:user/[email protected]//localhost:1521/XE 

następnie Wiosną applicationContext.xml

<context:property-placeholder location="classpath:jdbc.properties" /> 

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="java:comp/env/jdbc/prod" /> 
    <property name="defaultObject" ref="dataSourceFallback" /> 
</bean> 
<bean id="dataSourceFallback" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="${jdbc.driverClassName}" /> 
    <property name="url" value="${jdbc.url}" /> 
    <property name="poolPreparedStatements"> 
     <value>true</value> 
    </property> 
    <property name="maxActive"> 
     <value>4</value> 
    </property> 
    <property name="maxIdle"> 
     <value>1</value> 
    </property> 
</bean> 
2
<context:property-placeholder location="file:${catalina.home}/conf/myFirst.properties" ignore-unresolvable="true" /> 
<context:property-placeholder location="classpath:second.properties" ignore-unresolvable="true" /> 

to zrobić jak wyżej. Zmienna catalina.home pozwala na przesłanie pliku właściwości do katalogu domowego katalogu MAC.

0

jeśli używasz Tcserver i server.xml do konfigurowania zasobów, takich jak bazy danych, kolejki itp można przy użyciu com.springsource.tcserver.properties.SystemProperties

Delcare tego detektora w server.xml jak poniżej

<Listener className="com.springsource.tcserver.properties.SystemProperties" 
      file.1="${catalina.base}/conf/password.properties" 
      file.2="${catalina.base}/conf/server.properties" 
      immutable="false" 
      trigger="now"/> 

Teraz możesz przekazać właściwości do dwóch plików: password.properties i server.properties.

Powiązane problemy