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.