Birden çok proje / modülde birden çok özellik dosyası kullanma (PropertyPlaceholderConfigurer aracılığıyla)


104

Şu anda birden fazla projeye / modüle bölünmüş bir uygulama yazıyoruz. Örneğin, aşağıdaki modülleri ele alalım:

  • myApp-DAO
  • myApp-jabber

Her modülün kendi Spring bağlam xml dosyası vardır. DAO modülü için, gerekli db bağlantı parametreleriyle bir özellik dosyasını okuyan bir PropertyPlaceholderConfigurer'ım var. Jabber modülünde, jabber bağlantı özellikleri için bir de PropertyPlaceHolderConfigurer'ım var.

Şimdi myApp-DAO ve myApp-jabber'ı içeren ana uygulama geliyor. Tüm bağlam dosyalarını okur ve büyük bir Spring bağlamı başlatır. Maalesef, bağlam başına yalnızca bir PropertyPlaceholderConfigurer olabilir, bu nedenle hangi modül ilk yüklenirse, bağlantı parametrelerini okuyabilir. Diğeri, "Yer tutucu 'jabber.host' çözülemedi" gibi bir hatayla bir istisna atar.

Sorunun ne olduğunu anlıyorum, ama gerçekten bir çözüm ya da kullanım durumum için en iyi uygulamayı bilmiyorum.

Her modülü kendi özellik dosyasını yükleyebilecek şekilde nasıl yapılandırabilirim? Şu anda PropertyPlaceHolderConfigurer'ı ayrı bağlam dosyalarının dışına taşıdım ve bunları ana uygulamanın bağlamında birleştirdim (tüm özellik dosyalarını tek bir PropertyPlaceHolderConfigurer ile yüklüyorum). Bu berbat, çünkü artık dao modülünü kullanan herkesin kendi bağlamında bir PropertyPlaceHolderConfigurer'a ihtiyaç duyduğunu bilmesi gerekiyor .. ayrıca dao modülündeki entegrasyon testleri başarısız oluyor vs.

Stackoverflow topluluğundan çözümler / fikirler duymayı merak ediyorum ..

Yanıtlar:


182

İlgili bağlamların her birinde her yer sahibinin çözümlenemeyen anahtarları görmezden geldiğinden emin olursanız, bu yaklaşımların her ikisi de çalışır. Örneğin:

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

veya

    <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
Konuyla ilgili olarak, bu sorunları daha da çözmenize yardımcı olacak yararlı bir giriş: tarlogonjava.blogspot.com/2009/02/tips-regarding-springs.html
Tim Hennekey

2
TEŞEKKÜR EDERİM!! ignore-unresolvable = "true" tam da ihtiyacım olan şeydi ve hile yaptı!
black666

1
Tüm dosyayı 1 etikete eklerseniz, etkinlik gerekmez ignore-unresolvable="true", aksi takdirde gerekir.
Eric Wang

Anlamını açıklayabilir misin ignoreUnresolvablePlaceholders? Çözümlenemeyen yer sahipleri nelerdir?
emeraldhieu

PropertySourcesPlaceholderConfigurerİlkbahar 3.1'den beri varsayılan destek uygulamasıdır, bu nedenle PropertyPlaceholderConfigurerfasulye uygulama sınıfı yerine kullanmak mantıklıdır .
cihor

18

Bunun eski bir soru olduğunu biliyorum, ancak ignore-unresolvablemülk benim için çalışmıyordu ve nedenini bilmiyordum.

Sorun, harici bir kaynağa ihtiyacım olmasıydı (buna benzer bir şey location="file:${CATALINA_HOME}/conf/db-override.properties") ve ignore-unresolvable="true"bu durumda işi yapmıyor.

Eksik bir dış kaynağı görmezden gelmek için yapılması gereken şey şudur:

ignore-resource-not-found="true"

Başkasının buna rastlaması durumunda.


3
ignore-unresolvableve ignore-resource-not-foundfarklı amaçlara hizmet eder. Özellik dosyası yokken hataları önlemek için kullanın ignore-resource-not-found="true". Dosyada bulunmayan bir özelliği kullandığınızda hataları önlemek için kullanın ignore-unresolvable="true". Her biri kısmi özellik kümeleri içeren birden fazla dosyanız varsa ve her dosya mevcut olabilir veya olmayabilir, her ikisini de kullanmanız gerekecektir.
datguy

8

Birden <context:property-placeholder />çok PropertiesPlaceholderConfigurer çekirdeğini açıkça bildirmek yerine birden çok öğeye sahip olabilirsiniz .


İki <context: property-placeholder /> eleman kullanmayı denedim ve spring belirtilen özelliği tanımlayamadığından şikayet etti. Çalışması için kabul edilen cevabı uygulamalıyım.
Duygusal


2

Aşağıdaki çözümü denedim, makinemde çalışıyor.

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

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

İlkbahar bağlamında birden çok öğenin mevcut olması durumunda, izlenmesi gereken birkaç en iyi uygulama vardır:

bunların Spring tarafından işlenme sırasını düzeltmek için sipariş özniteliğinin belirtilmesi gerekir; tüm özellik yer tutucuları eksi sonuncusu (en yüksek sıra) ignore-unresolvable=”true”, çözüm mekanizmasının bir istisna atmadan bağlamda diğerlerine geçmesine izin vermelidir

kaynak: http://www.baeldung.com/2012/02/06/properties-with-spring/


Sipariş belirtilmesi gerekli mi? Bunu denedim ve jvm şikayet etti.
Duygusal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.