Używanie wielu plików właściwości (poprzez PropertyPlaceholderConfigurer) w wielu projektach / modułach


104

Obecnie piszemy aplikację, która jest podzielona na wiele projektów / modułów. Na przykład weźmy następujące moduły:

  • myApp-DAO
  • myApp-jabber

Każdy moduł ma własny plik XML kontekstu Spring. Dla modułu DAO mam PropertyPlaceholderConfigurer, który czyta plik właściwości z niezbędnymi parametrami połączenia bazy danych. W module Jabber mam również PropertyPlaceHolderConfigurer dla właściwości połączenia Jabber.

Teraz pojawia się główna aplikacja, która obejmuje myApp-DAO i myApp-jabber. Czyta wszystkie pliki kontekstowe i uruchamia jeden duży kontekst Spring. Niestety wydaje się, że może istnieć tylko jeden element PropertyPlaceholderConfigurer na kontekst, więc którykolwiek moduł zostanie załadowany jako pierwszy, będzie w stanie odczytać parametry połączenia. Drugi zgłasza wyjątek z błędem typu „Nie można rozpoznać symbolu zastępczego„ jabber.host ””

Rozumiem, na czym polega problem, ale tak naprawdę nie znam rozwiązania - ani najlepszej praktyki w moim przypadku.

Jak skonfigurować każdy moduł, aby każdy mógł załadować swój własny plik właściwości? W tej chwili przeniosłem PropertyPlaceHolderConfigurer z oddzielnych plików kontekstowych i połączyłem je z kontekstem głównej aplikacji (ładowanie wszystkich plików właściwości za pomocą jednego PropertyPlaceHolderConfigurer). To jest jednak do bani, ponieważ teraz każdy, kto używa modułu dao, musi wiedzieć, że potrzebuje PropertyPlaceHolderConfigurer w swoim kontekście ... również testy integracji w module dao kończą się niepowodzeniem itp.

Jestem ciekawy rozwiązań / pomysłów od społeczności stackoverflow.

Odpowiedzi:


182

Jeśli upewnisz się, że każdy obiekt zastępczy w każdym z kontekstów ignoruje nierozwiązywalne klucze, oba te podejścia działają. Na przykład:

<context:property-placeholder
location="classpath:dao.properties,
          classpath:services.properties,
          classpath:user.properties"
ignore-unresolvable="true"/>

lub

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:dao.properties</value>
                <value>classpath:services.properties</value>
                <value>classpath:user.properties</value>
            </list>
        </property> 
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
    </bean>

11
Oto przydatny wpis na ten temat, który powinien pomóc w dalszym rozwiązaniu tych problemów: tarlogonjava.blogspot.com/2009/02/tips-regarding-springs.html
Tim Hennekey,

2
DZIĘKUJĘ CI!! ignore-unresolvable = "true" było dokładnie tym, czego potrzebowałem i załatwiło sprawę!
black666

1
Jeśli dodasz cały plik w 1 tagu, nie potrzebujesz zdarzenia ignore-unresolvable="true", w przeciwnym razie potrzebujesz.
Eric Wang

Czy możesz wyjaśnić znaczenie ignoreUnresolvablePlaceholders? Co to są nierozwiązywalne posiadacze miejsc?
emeraldhieu

PropertySourcesPlaceholderConfigurerjest domyślną implementacją wspierającą od Spring 3.1, więc rozsądne jest użycie jej zamiast PropertyPlaceholderConfigurerklasy implementacji bean.
jihor

18

Wiem, że to stare pytanie, ale ignore-unresolvablenieruchomość nie działała dla mnie i nie wiedziałem dlaczego.

Problem polegał na tym, że potrzebowałem zewnętrznego zasobu (coś w rodzaju location="file:${CATALINA_HOME}/conf/db-override.properties") i ignore-unresolvable="true"nie spełniałem tego zadania w tym przypadku.

Aby zignorować brakujący zasób zewnętrzny, należy:

ignore-resource-not-found="true"

Na wypadek gdyby ktoś inny wpadł na to.


3
ignore-unresolvablei ignore-resource-not-foundsłużą różnym celom. Aby zapobiec błędom, gdy plik właściwości nie istnieje, użyj ignore-resource-not-found="true". Aby zapobiec błędom podczas korzystania z właściwości, która nie istnieje w pliku , użyj ignore-unresolvable="true". Jeśli masz wiele plików, z których każdy zawiera częściowe zestawy właściwości, a każdy plik może istnieć lub nie, musisz użyć obu.
datguy

8

<context:property-placeholder />Zamiast jawnie deklarować wiele komponentów bean PropertiesPlaceholderConfigurer można mieć wiele elementów.


Próbowałem użyć dwóch elementów <context: property-placeholder /> i wiosna narzekała, że ​​nie może zidentyfikować określonej właściwości. Muszę zaimplementować zaakceptowaną odpowiedź, żeby zadziałała.
Mushy


2

Wypróbowałem poniższe rozwiązanie, działa na moim komputerze.

<context:property-placeholder location="classpath*:connection.properties" ignore-unresolvable="true" order="1" />

<context:property-placeholder location="classpath*:general.properties" order="2"/>

Jeśli w kontekście Spring występuje wiele elementów, jest kilka sprawdzonych metod, których należy przestrzegać:

atrybut order musi być określony, aby ustalić kolejność, w jakiej są one przetwarzane przez Spring, wszystkie symbole zastępcze właściwości minus ostatni (najwyższy porządek) powinny ignore-unresolvable=”true”pozwolić mechanizmowi rozstrzygania na przekazanie do innych w kontekście bez zgłaszania wyjątku

źródło: http://www.baeldung.com/2012/02/06/properties-with-spring/


Czy wymagane jest zamówienie? Próbowałem tego i jvm narzekał.
Mushy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.