Sử dụng nhiều tệp thuộc tính (thông qua PropertyPlaceholderConfigurer) trong nhiều dự án / mô-đun


104

Chúng tôi hiện đang viết một ứng dụng được chia thành nhiều dự án / mô-đun. Ví dụ, hãy lấy các mô-đun sau:

  • myApp-DAO
  • myApp-jabber

Mỗi mô-đun có tệp xml ngữ cảnh Spring của riêng nó. Đối với mô-đun DAO, tôi có một PropertyPlaceholderConfigurer đọc tệp thuộc tính với các tham số kết nối db cần thiết. Trong mô-đun jabber, tôi cũng có một PropertyPlaceHolderConfigurer cho các thuộc tính kết nối jabber.

Bây giờ là ứng dụng chính bao gồm myApp-DAO và myApp-jabber. Nó đọc tất cả các tệp ngữ cảnh và bắt đầu một ngữ cảnh Spring lớn. Thật không may, có vẻ như chỉ có thể có một PropertyPlaceholderConfigurer cho mỗi ngữ cảnh, vì vậy bất kỳ mô-đun nào được tải trước đều có thể đọc các thông số kết nối của nó. Cái khác ném ra một ngoại lệ với lỗi như "Không thể giải quyết trình giữ chỗ 'jabber.host'"

Tôi hiểu vấn đề là gì, nhưng tôi không thực sự biết giải pháp - hoặc phương pháp tốt nhất cho usecase của tôi.

Tôi sẽ định cấu hình từng mô-đun như thế nào để mỗi mô-đun có thể tải tệp thuộc tính của riêng mình? Ngay bây giờ tôi đã di chuyển PropertyPlaceHolderConfigurer ra khỏi các tệp ngữ cảnh riêng biệt và hợp nhất chúng vào ngữ cảnh của ứng dụng chính (tải tất cả các tệp thuộc tính bằng một PropertyPlaceHolderConfigurer). Tuy nhiên, điều này thật tệ, bởi vì bây giờ tất cả những người sử dụng mô-đun dao đều phải biết rằng họ cần một PropertyPlaceHolderConfigurer trong ngữ cảnh của họ .. cũng như các bài kiểm tra tích hợp trong mô-đun dao không thành công, v.v.

Tôi tò mò muốn nghe về các giải pháp / ý tưởng từ cộng đồng stackoverflow ..

Câu trả lời:


182

Nếu bạn đảm bảo rằng mọi người giữ chỗ, trong từng ngữ cảnh liên quan, đều bỏ qua các khóa không thể giải quyết thì cả hai cách tiếp cận này đều hoạt động. Ví dụ:

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

hoặc là

    <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
Dưới đây là một mục hữu ích về chủ đề này mà sẽ giúp bạn tiếp tục giải quyết những vấn đề này: tarlogonjava.blogspot.com/2009/02/tips-regarding-springs.html
Tim Hennekey

2
CẢM ƠN BẠN!! ignore-unresolvable = "true" là chính xác những gì tôi cần và nó đã thành công!
black666,

1
Nếu bạn thêm tất cả tệp trong 1 thẻ thì không cần sự kiện ignore-unresolvable="true", ngược lại thì cần.
Eric Wang,

Bạn có thể giải thích ý nghĩa của ignoreUnresolvablePlaceholders? Người giữ chỗ không thể giải quyết là gì?
emeraldhieu

PropertySourcesPlaceholderConfigurerlà cách triển khai sao lưu mặc định kể từ Spring 3.1, vì vậy có thể sử dụng thay vì PropertyPlaceholderConfigurerlàm lớp triển khai bean.
jihor

18

Tôi biết rằng đây là một câu hỏi cũ, nhưng ignore-unresolvabletài sản không hoạt động cho tôi và tôi không biết tại sao.

Vấn đề là tôi cần một nguồn bên ngoài (một cái gì đó giống như location="file:${CATALINA_HOME}/conf/db-override.properties") và ignore-unresolvable="true"nó không thực hiện được công việc trong trường hợp này.

Những gì người ta cần làm để bỏ qua một tài nguyên bên ngoài bị thiếu là:

ignore-resource-not-found="true"

Đề phòng bất kỳ ai khác đụng phải điều này.


3
ignore-unresolvableignore-resource-not-foundphục vụ các mục đích khác nhau. Để tránh lỗi khi tệp thuộc tính không tồn tại, hãy sử dụng ignore-resource-not-found="true". Để tránh lỗi khi bạn sử dụng thuộc tính không tồn tại trong tệp , hãy sử dụng ignore-unresolvable="true". Nếu bạn có nhiều tệp mà mỗi tệp chứa một phần thuộc tính và mỗi tệp có thể tồn tại hoặc không, bạn sẽ cần sử dụng cả hai.
datguy

8

Bạn có thể có nhiều <context:property-placeholder />phần tử thay vì khai báo rõ ràng nhiều bean PropertiesPlaceholderConfigurer.


Tôi đã thử sử dụng hai phần tử <context: property-placeholder /> và mùa xuân phàn nàn rằng nó không thể xác định thuộc tính được chỉ định. Tôi phải triển khai câu trả lời được chấp nhận để nó hoạt động.
Mushy

4

Các PropertiesPlaceholderConfigurerhạt có một tài sản thay thế được gọi là "propertiesArray". Sử dụng thuộc tính này thay vì thuộc tính "thuộc tính" và định cấu hình nó bằng một <array>tham chiếu thuộc tính.


2

Tôi đã thử giải pháp bên dưới, nó hoạt động trên máy của tôi.

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

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

Trong trường hợp có nhiều phần tử trong ngữ cảnh Spring, có một số phương pháp hay nhất cần tuân theo:

thuộc tính order cần phải được chỉ định để sửa thứ tự trong đó Spring xử lý tất cả các trình giữ chỗ thuộc tính trừ phần cuối cùng (thứ tự cao nhất) phải ignore-unresolvable=”true”cho phép cơ chế phân giải chuyển cho những người khác trong ngữ cảnh mà không đưa ra ngoại lệ

nguồn: http://www.baeldung.com/2012/02/06/properties-with-spring/


Có yêu cầu đơn đặt hàng không? Tôi đã thử điều này và jvm đã phàn nàn.
Mushy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.