wtorek, 4 listopada 2008

Spring property-placeholder i zewnętrzny plik properties

oj dzisiaj trochę czasu straciłem, niż w końcu znalazłem na jakimś bloku w komentarzu, dręczącą mnie odpowiedź, jak w Springu wczytać coś do ziarna springowego z zewnętrznego pliku properties.
Przykład z Mule 2.0.2 który wewnętrznie stosuje Springa, do wczytania pliku konfiguracyjnego:
<context:property-placeholder location="file:///Users/lipka/Documents/workspace/JMSRequest_Spring/conf/soft.properties" />
wczytanie properties w przypadku gdy w jarze mamy, następującą strukturę conf/soft.properties (wewnętrznie) wtedy odwołanie do properties wygląda tak:
<context:property-placeholder location="conf/soft.properties" />
odwołanie się do konkretnej wartości z pliku properties w ziarnie wygląda tak:
<spring:bean id="externalProgram" class="com.itsilesia.jmsexample.RunMe">
<spring:property name="programPath" value="${soft}"></spring:property>
</spring:bean>
a sam plik soft.properties
soft=/Applications/DrawIt.app/Contents/MacOS/DrawIt
Z ciekawych rzeczy to wysychałem dzisiaj http://agiletuning.pl/ o programowaniu w parach, gorąco polecam.
PS. jeśli mamy więcej plików properties to porostu po przecinku je dodajemy:)

3 komentarze:

Kamil Demecki pisze...

Uzywalem takiego ustawienia. Pozwalalo na podanie property dla hibernate w zewnetrzym pliku, wazne jest ignoreUnresolvablePlaceholders gdy nalezy wczytac kilka plikow properties w roznych beanach PropertyPlaceholderConfigurer.

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:hibernate-xxx-testy.properties" />
<property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>

Łukasz Lipka pisze...

jak będę jeszcze coś tam zmieniał to sprawdzę Twój sposób :) tylko, że ty masz tutaj value="classpath:" co oznacza, że plik properties musi być w jarze, a tego chciałem uniknąć i użyłem zamiast classpath zmiennej file: która wskazuje na zewnętrzny plik properties.

Bartek Zdanowski pisze...

@Łukasz,
value="classpath:" nie oznacza, że to jest tylko w JARze. Classpath jest rozszerzony o katalogi charakterystyczne dla danego AS. Np Tomcat ma katalog lib dodany do classpatha. Więc można np dodać własny podkatalog "properties" i można wówczas użyć:
value="classpath:properties/configuration.properties" i albo znajdzie go w WARze aplikacji albo w katalogu tomcat/lib/properties. Używam tego w projekcie jako override'owanie konfiguracji. Domyślnie jest ona zaszyta w WARze, ale na produkcji na dysku znajduje się konfiguracja.