Korzystanie z wielu plików właściwości (poprzez PropertyPlaceholderConfigurer) w wielu projektach/modułach

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 swój własny plik XML kontekstowy Spring. Dla modułu DAO mam PropertyPlaceholderConfigurer, który odczytuje plik właściwości z niezbędnymi parametrami połączenia db. W module Jabbera mam też PropertyPlaceHolderConfigurer dla połączenia Jabbera właściwości.

Teraz pojawia się główna aplikacja, która zawiera myApp-DAO i MyApp-jabber. Czyta wszystkie pliki kontekstowe i uruchamia jeden duży kontekst wiosenny. Niestety wygląda na to, że może być tylko jeden PropertyPlaceholderConfigurer dla każdego kontekstu, więc niezależnie od tego, który moduł zostanie załadowany jako pierwszy, może odczytać jego parametry połączenia. Drugi wyrzuca wyjątek z błędem "Could not resolve placeholder' jabber.host' "

W pewnym sensie rozumiem w czym problem, ale tak naprawdę nie znam rozwiązania - lub najlepszej praktyki dla mojego zastosowania.

Jak skonfigurować każdy moduł tak, aby każdy mógł załadować swój własny plik właściwości? W tej chwili przeniosłem PropertyPlaceHolderConfigurer z osobnych plików kontekstowych i połączyłem je z głównym kontekstem aplikacji (ładując wszystkie pliki właściwości za pomocą jednego PropertyPlaceHolderConfigurer). Jest to jednak do bani, ponieważ teraz każdy, kto korzysta z modułu dao, musi wiedzieć, że potrzebuje PropertyPlaceHolderConfigurer w ich kontekście .. również testy integracyjne w module dao zawodzą itp.

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

Author: black666, 2010-08-04

5 answers

Jeśli upewnisz się, że każdy posiadacz miejsca, w każdym z kontekstów, ignoruje nierozwiązywalne klucze, wtedy 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>
 173
Author: Tim Hennekey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-14 16:03:46

Wiem, że to stare pytanie, ale ignore-unresolvable nieruchomość 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"), a ignore-unresolvable="true" nie spełnia w tym przypadku zadania.

To, co trzeba zrobić, aby ignorować brakujący zewnętrzny zasób, to:

ignore-resource-not-found="true"
Na wypadek, gdyby ktoś inny wpadł w to.
 18
Author: Raul Rene,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-24 18:00:00

Możesz mieć wiele <context:property-placeholder /> elementów zamiast jawnie deklarować wiele właściwości.

 8
Author: earldouglas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-04 14:35:24

The PropertiesPlaceholderConfigurer bean ma alternatywną właściwość o nazwie "propertiesArray". Użyj tej właściwości zamiast Właściwości "properties" i skonfiguruj ją za pomocą referencji właściwości <array>.

 4
Author: Stephen C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-04 09:10:54

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

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

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

W przypadku, gdy w Wiosenny kontekst, jest kilka najlepszych praktyk, które powinny być "followed": {]}

Atrybut order musi być określony, aby ustalić kolejność, w której są one przetwarzane przez Spring wszystkie placeholdery właściwości minus ostatni jeden (Najwyższy Porządek) powinien mieć ignore-unresolvable=”true”, aby umożliwić mechanizm restrukturyzacji i uporządkowanej likwidacji przekazywany innym w kontekście bez throwing an exception

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

 0
Author: onurbaysan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-27 12:10:07