การใช้ไฟล์คุณสมบัติหลายไฟล์ (ผ่าน PropertyPlaceholderConfigurer) ในหลายโครงการ / โมดูล


104

ขณะนี้เรากำลังเขียนแอปพลิเคชันซึ่งแบ่งออกเป็นหลายโครงการ / โมดูล ตัวอย่างเช่นลองใช้โมดูลต่อไปนี้:

  • myApp-DAO
  • myApp-jabber

แต่ละโมดูลมีไฟล์ xml บริบท Spring ของตัวเอง สำหรับโมดูล DAO ฉันมี PropertyPlaceholderConfigurer ซึ่งอ่านไฟล์คุณสมบัติที่มีพารามิเตอร์การเชื่อมต่อ db ที่จำเป็น ในโมดูล jabber ฉันยังมี PropertyPlaceHolderConfigurer สำหรับคุณสมบัติการเชื่อมต่อ jabber

ตอนนี้แอปพลิเคชันหลักมาพร้อมกับ myApp-DAO และ myApp-jabber มันอ่านไฟล์บริบททั้งหมดและเริ่มบริบท Spring ขนาดใหญ่หนึ่งรายการ น่าเสียดายที่ดูเหมือนว่าจะมี PropertyPlaceholderConfigurer ได้เพียงหนึ่งรายการต่อบริบทดังนั้นโมดูลใดที่โหลดก่อนจึงสามารถอ่านพารามิเตอร์การเชื่อมต่อได้ อีกอันหนึ่งแสดงข้อยกเว้นพร้อมข้อผิดพลาดเช่น "ไม่สามารถแก้ไขตัวยึดตำแหน่ง 'jabber.host'"

ฉันเข้าใจว่าปัญหาคืออะไร แต่ฉันไม่รู้วิธีแก้ปัญหาหรือแนวทางปฏิบัติที่ดีที่สุดสำหรับกรณีการใช้งานของฉัน

ฉันจะกำหนดค่าแต่ละโมดูลเพื่อให้แต่ละโมดูลสามารถโหลดไฟล์คุณสมบัติของตัวเองได้อย่างไร ตอนนี้ฉันได้ย้าย PropertyPlaceHolderConfigurer ออกจากไฟล์บริบทที่แยกจากกันและรวมเข้ากับบริบทของแอปพลิเคชันหลัก (โหลดไฟล์คุณสมบัติทั้งหมดด้วย PropertyPlaceHolderConfigurer เดียว) แม้ว่าสิ่งนี้จะแย่เพราะตอนนี้ทุกคนที่ใช้โมดูล dao ต้องรู้ว่าพวกเขาต้องการ PropertyPlaceHolderConfigurer ในบริบทของพวกเขา .. รวมถึงการทดสอบการรวมในโมดูล dao ก็ล้มเหลวเป็นต้น

ฉันอยากรู้เกี่ยวกับวิธีแก้ปัญหา / แนวคิดจากชุมชน stackoverflow ..

คำตอบ:


182

หากคุณมั่นใจว่าตัวยึดสถานที่ทุกแห่งในแต่ละบริบทที่เกี่ยวข้องกำลังละเว้นคีย์ที่ไม่สามารถแก้ไขได้วิธีการทั้งสองนี้ก็ใช้ได้ผล ตัวอย่างเช่น:

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

หรือ

    <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
นี่คือรายการที่เป็นประโยชน์ในหัวข้อที่จะช่วยคุณแก้ไขปัญหาเหล่านี้เพิ่มเติม: tarlogonjava.blogspot.com/2009/02/tips-regarding-springs.html
Tim Hennekey

2
ขอบคุณ!! Ignore-unresolvable = "true" คือสิ่งที่ฉันต้องการและมันก็เป็นเคล็ดลับ!
black666

1
หากคุณเพิ่มไฟล์ทั้งหมดใน 1 แท็กก็ไม่จำเป็นต้องมีเหตุการณ์ไม่เช่นนั้นignore-unresolvable="true"ต้อง
Eric Wang

คุณสามารถอธิบายความหมายของignoreUnresolvablePlaceholders? ตัวยึดที่ไม่สามารถแก้ไขได้คืออะไร?
emeraldhieu

PropertySourcesPlaceholderConfigurerเป็นการดำเนินการสำรองเริ่มต้นตั้งแต่ Spring 3.1 ดังนั้นจึงเหมาะสมที่จะใช้แทนPropertyPlaceholderConfigurerการใช้คลาส bean
jihor

18

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ ignore-unresolvableสถานที่ให้บริการไม่ได้ผลสำหรับฉันและฉันไม่รู้ว่าทำไม

ปัญหาคือฉันต้องการทรัพยากรภายนอก (บางอย่างเช่นlocation="file:${CATALINA_HOME}/conf/db-override.properties") และไฟล์ignore-unresolvable="true"ไม่ทำงานในกรณีนี้

สิ่งที่ต้องทำเพื่อละเว้นทรัพยากรภายนอกที่ขาดหายไปคือ:

ignore-resource-not-found="true"

ในกรณีที่มีคนอื่นกระแทกเข้ามา


3
ignore-unresolvableและignore-resource-not-foundตอบสนองวัตถุประสงค์ที่แตกต่างกัน เพื่อป้องกันข้อผิดพลาดเมื่อไม่มีไฟล์คุณสมบัติให้ใช้ignore-resource-not-found="true". เพื่อป้องกันข้อผิดพลาดเมื่อคุณใช้คุณสมบัติที่ไม่มีอยู่ในไฟล์ให้ใช้ignore-unresolvable="true". หากคุณมีไฟล์หลายไฟล์ซึ่งแต่ละไฟล์มีชุดคุณสมบัติบางส่วนและแต่ละไฟล์อาจมีหรือไม่มีอยู่คุณจะต้องใช้ทั้งสองไฟล์
datguy

8

คุณสามารถมีหลาย<context:property-placeholder />องค์ประกอบแทนการประกาศถั่ว PropertiesPlaceholderConfigurer หลายรายการอย่างชัดเจน


ฉันลองใช้สององค์ประกอบ <บริบท: ตัวยึดคุณสมบัติ /> และสปริงบ่นว่าไม่สามารถระบุคุณสมบัติที่ระบุได้ ฉันต้องใช้คำตอบที่ยอมรับเพื่อให้ได้ผล
Mushy


2

ฉันลองวิธีแก้ปัญหาด้านล่างแล้วมันใช้ได้กับเครื่องของฉัน

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

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

ในกรณีที่มีหลายองค์ประกอบในบริบท Spring มีแนวทางปฏิบัติที่ดีที่สุดบางประการที่ควรปฏิบัติดังนี้

จำเป็นต้องระบุแอตทริบิวต์คำสั่งเพื่อแก้ไขลำดับที่สิ่งเหล่านี้ถูกประมวลผลโดย Spring ตัวยึดคุณสมบัติทั้งหมดลบด้วยตัวสุดท้าย (ลำดับสูงสุด) ควรจะต้องignore-unresolvable=”true”อนุญาตให้กลไกการแก้ไขส่งผ่านไปยังผู้อื่นในบริบทโดยไม่ต้องมีข้อยกเว้น

ที่มา: http://www.baeldung.com/2012/02/06/properties-with-spring/


จำเป็นต้องระบุคำสั่งซื้อหรือไม่ ฉันลองสิ่งนี้และ jvm ก็บ่น
Mushy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.