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.

czarny666
źródło

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>
Tim Hennekey
źródło
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.

Raul Rene
źródło
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.

earldouglas
źródło
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
4

PropertiesPlaceholderConfigurerFasola ma alternatywną właściwość o nazwie „propertiesArray”. Użyj tego zamiast właściwości „properties” i skonfiguruj ją przy użyciu <array>odwołań do właściwości.

Stephen C.
źródło
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/

onurbaysan
źródło
Czy wymagane jest zamówienie? Próbowałem tego i jvm narzekał.
Mushy