Menggunakan beberapa file properti (melalui PropertyPlaceholderConfigurer) dalam beberapa proyek / modul

104

Kami sedang menulis sebuah aplikasi yang dibagi menjadi beberapa proyek / modul. Misalnya, mari kita ambil modul berikut:

  • myApp-DAO
  • myApp-jabber

Setiap modul memiliki file xml konteks Musim Semi sendiri. Untuk modul DAO saya memiliki PropertyPlaceholderConfigurer yang membaca file properti dengan parameter koneksi db yang diperlukan. Dalam modul jabber saya juga memiliki PropertyPlaceHolderConfigurer untuk properti koneksi jabber.

Sekarang hadir aplikasi utama yang mencakup myApp-DAO dan myApp-jabber. Itu membaca semua file konteks dan memulai satu konteks Spring yang besar. Sayangnya, tampaknya hanya ada satu PropertyPlaceholderConfigurer per konteks, jadi modul mana pun yang dimuat lebih dulu dapat membaca parameter koneksinya. Yang lain melontarkan pengecualian dengan kesalahan seperti "Tidak dapat menyelesaikan placeholder 'jabber.host'"

Saya agak mengerti apa masalahnya, tetapi saya tidak benar-benar tahu solusinya - atau praktik terbaik untuk kasus penggunaan saya.

Bagaimana saya mengkonfigurasi setiap modul sehingga masing-masing dapat memuat file propertinya sendiri? Saat ini saya telah memindahkan PropertyPlaceHolderConfigurer dari file konteks terpisah dan menggabungkannya ke dalam konteks aplikasi utama (memuat semua file properti dengan satu PropertyPlaceHolderConfigurer). Ini menyebalkan, karena sekarang setiap orang yang menggunakan modul dao harus tahu, bahwa mereka membutuhkan PropertyPlaceHolderConfigurer dalam konteksnya .. juga tes integrasi dalam modul dao gagal dll.

Saya ingin tahu tentang solusi / ide dari komunitas stackoverflow ..

black666
sumber

Jawaban:

182

Jika Anda memastikan bahwa setiap placeholder, dalam setiap konteks yang terlibat, mengabaikan kunci yang tidak dapat diselesaikan, maka kedua pendekatan ini berfungsi. Sebagai contoh:

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

atau

    <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
sumber
11
Berikut adalah entri yang berguna tentang subjek yang akan membantu Anda menyelesaikan masalah ini lebih lanjut: tarlogonjava.blogspot.com/2009/02/tips-regarding-springs.html
Tim Hennekey
2
TERIMA KASIH!! ignore-unresolvable = "true" persis seperti yang saya butuhkan dan itu berhasil!
black666
1
Jika Anda menambahkan semua file dalam 1 tag, maka acara tidak perlu ignore-unresolvable="true", jika tidak perlu.
Eric Wang
Bisakah Anda menjelaskan artinya ignoreUnresolvablePlaceholders? Apa placeholder yang tidak bisa diselesaikan?
emeraldhieu
PropertySourcesPlaceholderConfigureradalah implementasi dukungan default sejak Spring 3.1, jadi lebih masuk akal untuk digunakan daripada PropertyPlaceholderConfigurersebagai kelas implementasi kacang.
jihor
18

Saya tahu bahwa ini adalah pertanyaan lama, tetapi ignore-unresolvableproperti itu tidak berfungsi untuk saya dan saya tidak tahu mengapa.

Masalahnya adalah saya membutuhkan sumber daya eksternal (seperti location="file:${CATALINA_HOME}/conf/db-override.properties") dan ignore-unresolvable="true"tidak melakukan pekerjaan dalam kasus ini.

Apa yang perlu dilakukan untuk mengabaikan sumber daya eksternal yang hilang adalah:

ignore-resource-not-found="true"

Kalau-kalau ada orang lain yang menabrak ini.

Raul Rene
sumber
3
ignore-unresolvabledan ignore-resource-not-foundmelayani tujuan yang berbeda. Untuk mencegah kesalahan ketika file properti tidak ada, gunakan ignore-resource-not-found="true". Untuk mencegah kesalahan saat Anda menggunakan properti yang tidak ada di file , gunakan ignore-unresolvable="true". Jika Anda memiliki beberapa file yang masing-masing berisi kumpulan properti parsial, dan setiap file mungkin ada atau mungkin tidak ada, Anda perlu menggunakan keduanya.
datguy
8

Anda dapat memiliki banyak <context:property-placeholder />elemen alih-alih mendeklarasikan beberapa kacang PropertiesPlaceholderConfigurer secara eksplisit.

earldouglas
sumber
Saya mencoba menggunakan dua elemen <konteks: properti-placeholder /> dan musim semi mengeluh tidak dapat mengidentifikasi properti yang ditentukan. Saya harus menerapkan jawaban yang diterima agar berfungsi.
Mushy
4

The PropertiesPlaceholderConfigurerkacang memiliki properti alternatif yang disebut "propertiesArray". Gunakan ini sebagai ganti properti "properti", dan konfigurasikan dengan <array>referensi properti.

Stephen C
sumber
2

Saya mencoba solusi di bawah ini, ini berfungsi pada mesin saya.

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

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

Jika ada beberapa elemen dalam konteks Spring, ada beberapa praktik terbaik yang harus diikuti:

Atribut pesanan perlu ditentukan untuk memperbaiki urutan di mana ini diproses oleh Spring, semua placeholder properti dikurangi yang terakhir (urutan tertinggi) harus ignore-unresolvable=”true”memungkinkan mekanisme resolusi untuk diteruskan ke orang lain dalam konteks tanpa membuat pengecualian

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

onurbaysan
sumber
Apakah pesanan ditentukan diperlukan? Saya mencoba ini dan jvm mengeluh.
Mushy