2013-07-05 41 views
7

Tôi trước đây đã sử dụng, hiện không được chấp nhận, lớp org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer để tải tệp thuộc tính từ hệ thống tệp của máy chủ. Tôi đã đậu sau definied:Tomcat Context-Params bị bỏ qua trong Spring webapp khi sử dụng PropertyPlaceholder

<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer"> 
    <property name="locations" value="${config}"/> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/> 
    <property name="ignoreUnresolvablePlaceholders" value="true"/> 
    <property name="searchContextAttributes" value="true"/> 
    <property name="contextOverride" value="false"/> 
    <property name="ignoreResourceNotFound" value="true"/> 
    <property name="searchSystemEnvironment" value="false"/> 
</bean> 

Các config là một cuộc tranh cãi đó là thông qua khi khởi động Tomcat, tức là

-Dconfig=/path/to/application.properties 

Đối với webapp Tôi cũng có một tập tin ngữ cảnh:

<Context docBase="/path/to/application.war"> 
    <Parameter name="host" value="localhost" override="false"/> 
    <Parameter name="port" value="8080" override="false"/> 
</Context> 

Nếu tệp .properties, được chỉ định bởi đối số -Dconfig, chứa thuộc tính mà một số tham chiếu bean khác thì giá trị từ .properties tệp được sử dụng, nếu không giá trị từ tệp xml ngữ cảnh được sử dụng.

Điều này cho phép tôi có một tập hợp các thuộc tính mặc định được triển khai với WAR và nếu được yêu cầu, tôi có thể chỉ định tệp .properties để ghi đè các giá trị cụ thể.

Bây giờ, tôi đang cập nhật để sử dụng các tính năng trừu tượng hóa thuộc tính mới trong Spring 3.1 nhưng tôi dường như không thể tìm ra cách tiếp cận tương đương với điều này là gì?

Tôi có tập tin bối cảnh tương tự và chiến tranh được triển khai trong cùng một cách, và bây giờ tôi có những điều sau đây trong ứng dụng:

<context:property-placeholder 
     location="${config}" 
     system-properties-mode="OVERRIDE" 
     ignore-resource-not-found="true" 
     ignore-unresolvable="true"/> 

này tìm và sử dụng các tính chất từ ​​các thuộc tính tập tin, nhưng nó không sử dụng các giá trị từ tệp XML ngữ cảnh.

Làm cách nào để ứng dụng của tôi sử dụng thông số ngữ cảnh khi sử dụng trình giữ chỗ thuộc tính mới này?

Cảm ơn.

Trả lời

4

Để tóm tắt sự cố là các tham số ngữ cảnh từ tệp ngữ cảnh servlet không được sử dụng để giải quyết trình giữ chỗ khi sử dụng không gian tên trình giữ chỗ thuộc tính mới được giới thiệu trong Spring 3.1.

tôi đã tìm ra một giải pháp, với những điều sau

<context:property-placeholder location="${config}" local-override="true" ignore-resource-not-found="true"/> 

Tôi có thể chỉ định một hoặc nhiều tập tin * .properties trên hệ thống tập tin địa phương sử dụng một arg JVM, ví dụ:

-Dconfig=/path/app.properties 

Nếu một thuộc tính giữ chỗ không thể được giải quyết sau khi kiểm tra tệp app.properties sau đó các Tham số ngữ cảnh Servlet được chọn.

Điều này cho phép tôi có giá trị mặc định bằng cách sử dụng tham số ngữ cảnh trong tệp web.xml và nơi tôi cần để tôi có thể ghi đè các giá trị này bằng cách chỉ định vị trí của tệp * .properties bằng cách sử dụng config JVM arg.

Chìa khóa để làm cho nó hoạt động theo cách này là bao gồm local-override="true", là sai theo mặc định. Tôi không hoàn toàn chắc chắn rằng điều đó có ý nghĩa, vì mô tả cho thuộc tính đó là:

Chỉ định xem thuộc tính cục bộ có ghi đè thuộc tính từ tệp hay không. Mặc định là "sai": Thuộc tính từ tệp ghi đè mặc định địa phương.

Nếu cùng một khóa thuộc tính tồn tại trong app.propertiesweb.xml giá trị từ app.properties được sử dụng.

1

Mùa xuân sử dụng tệp thuộc tính mặc định trừ khi tệp thuộc tính dựa trên người dùng được xác định. Nếu bạn muốn kiểm soát tệp .properties, vui lòng thực hiện theo các hướng dẫn được đăng here.

Nếu bạn muốn tận dụng lợi thế của application.properties, có hai cách để thực hiện.

<!-- allows for ${} replacement in the spring xml configuration from the 
    system.properties file on the classpath --> 
<util:properties id="appProperties" location="classpath:application.properties"/> 
<context:property-placeholder location="classpath:application.properties"/> 

thẻ util cho phép bạn sử dụng lớp Thuộc tính để đọc các thuộc tính trên ứng dụng của bạn. Ví dụ:

@Autowired 
public MyPropertyReader(Properties appProperties) { 
    String prop1 = appProperties.getProperty("my.address"); 
    String prop2 = appProperties.getProperty("my.version"); 
} 

Nếu bạn muốn sử dụng giá trị trong tệp ngữ cảnh của mình, hãy sử dụng ngữ cảnh: thẻ giữ chỗ của thuộc tính. Sau đó, bạn có thể sử dụng các giá trị của mình dưới dạng

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory" p:brokerURL="${jms.primary.server}"/> 

nơi ví dụ: jms.primary.server = 172.168.10.18: 6161 trong application.properties.

+0

Tôi không nghĩ rằng bạn đã hiểu đầy đủ bài đăng gốc của mình. Tôi có phần giữ chỗ đã được giải quyết bằng cách sử dụng tệp thuộc tính. Câu hỏi sẽ hỏi về việc sử dụng Tham số ngữ cảnh. – C0deAttack

+0

Bạn đã theo liên kết từ câu 1 chưa? Phần còn lại của câu trả lời chỉ là một add-on cho các nhà phát triển khác sử dụng .properties và application.properties. – luksmir

+0

Vấn đề là về Tham số ngữ cảnh - không phải tệp thuộc tính. – C0deAttack

Các vấn đề liên quan