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.
źródło
ignore-unresolvable="true"
, w przeciwnym razie potrzebujesz.ignoreUnresolvablePlaceholders
? Co to są nierozwiązywalne posiadacze miejsc?PropertySourcesPlaceholderConfigurer
jest domyślną implementacją wspierającą od Spring 3.1, więc rozsądne jest użycie jej zamiastPropertyPlaceholderConfigurer
klasy implementacji bean.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"
) iignore-unresolvable="true"
nie spełniałem tego zadania w tym przypadku.Aby zignorować brakujący zasób zewnętrzny, należy:
Na wypadek gdyby ktoś inny wpadł na to.
źródło
ignore-unresolvable
iignore-resource-not-found
służą różnym celom. Aby zapobiec błędom, gdy plik właściwości nie istnieje, użyjignore-resource-not-found="true"
. Aby zapobiec błędom podczas korzystania z właściwości, która nie istnieje w pliku , użyjignore-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.<context:property-placeholder />
Zamiast jawnie deklarować wiele komponentów bean PropertiesPlaceholderConfigurer można mieć wiele elementów.źródło
PropertiesPlaceholderConfigurer
Fasola 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.źródło
Wypróbowałem poniższe rozwiązanie, działa na moim komputerze.
źródło: http://www.baeldung.com/2012/02/06/properties-with-spring/
źródło