2011-04-08 19 views
20

'daki JVM bağımsız değişkenlerini nasıl okurum? İlkbaharda bir JSF web uygulamasına sahibim ve JVM bağımsız değişkenlerini applicationContext.xml dosyasından referans almaya çalışıyorum. JVM'yi bir ortam argümanı ile başlatıyorum (örneğin, -Denv = geliştirme). Ben buldum ve dahil olmak üzere birkaç farklı yaklaşımlar denedi: ayarlayıcı yöntem Sınıfım içinde çağrılırSpring applicationContext.xml

<bean id="myBean" class="com.foo.bar.myClass"> 
    <property name="environment"> 
    <value>${environment}</value> 
    </property> 
</bean> 

Fakat, dize "$ {ortam}" yerine "kalkınma", geçirilir. System.getProperty() işlevini kullanmak için yerinde bir işim var, ancak bu değerleri Spring üzerinden ayarlayabilmek daha güzel ve daha temiz olurdu. Bunu yapmanın bir yolu var mı?

Düzelt: Daha önce bahsettiğim, JDBC bağlantısı kullanarak veritabanımdan özellikler yüklüyorum. Bu karmaşıklık katıyor gibi görünüyor, çünkü bir özellik yer tutucuyu yapılandırmamda eklediğimde, veritabanından yüklenen özellikler özellik yer tutucusu tarafından geçersiz kılınır. Sipariş bağımlı ya da bir şey olduğundan emin değilim. Sanki birini ya da diğerini yapabilirim, ama ikisini de değil.

Düzenleme: Şu anda aşağıdaki yapılandırmayı kullanarak özelliklere yükleme ediyorum: Senin durumunda -Dtest="hallo welt"

için

<bean id="myDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="jdbc.mydb.myschema"/> 
</bean> 

<bean id="props" class="com.foo.bar.JdbcPropertiesFactoryBean"> 
    <property name="jdbcTemplate"> 
     <bean class="org.springframework.jdbc.core.JdbcTemplate"> 
      <constructor-arg ref="myDataSource" /> 
     </bean> 
    </property> 
</bean> 

<context:property-placeholder properties-ref="props" /> 

cevap

26

Sen Bahar EL ifadeleri kullanabilirsiniz, o zaman öyle #{systemProperties.test} olması gerektiği:

<bean id="myBean" class="com.foo.bar.myClass"> 
    <property name="environment"> 
    <value>#{systemProperties.environment}</value> 
    </property> 
</bean> 

# yerine $ hata değil! # fasulye ifade eder ve systemProperties bir fasulye iken

$, yer tutucular bakın olur.


Mayıs sadece bir yazım hatası olduğunu, ancak may sizin sorunun nedeni şudur: komut satırı deyimi için örnekte örneğin değişken env

(-Denv=development, adlandırın. ..

Ama bahar yapılandırmasında

bunu environment isim. Ancak her iki elbette eşittir olmalı!

+0

Örneğimdeki yaklaşımı kullanarak bu yaklaşımı kullanarak aynı sonucu elde ediyorum. "# {SystemProperties.environment}" dizesi, setter yöntemine geçirilen dizedir. – jinxed

+0

@jinxed: Sanırım son problemi buldum, bir yazım hatası vardı. - uzatılmış cevabımı gör. – Ralph

10

Bir PropertyPlaceholderConfigurer kaydederseniz, sistem özelliklerini geri dönüş olarak kullanır.

Örneğin, yapılandırmaya

<context:property-placeholder/> 

ekleyin. Sonra, XML yapılandırmanızda veya @Value ek açıklamalarında ${environment}'u kullanabilirsiniz.

+0

Bunu yapılandırmaya eklediğimde, bu özellik yer tutucusu tarafından veritabanından yüklediğim özellikler geçersiz kılınır. Düzenlenmiş orijinal açıklama. – jinxed

+0

Veritabanı özellikleri nasıl yüklenir? PropertyPlaceholderConfigurer yapılandırmasının bir parçası mı? – sourcedelica

+0

JDBC yoluyla, soruda (yukarıda) gösterilen yapılandırma kullanılarak yüklenir ... – jinxed

3

Böyle sistem özelliğine env dayalı bir özellik dosyası yükleyebilirsiniz: Üretim aksi gelişimine bunu varsayılan ayarlanmaz ve test ekipleri -Denv=development veya -Denv=testing ayarlayarak uygulamanın ilgili tadında olabilir

<bean id="applicationProperties" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="ignoreResourceNotFound" value="false" /> 
     <property name="ignoreUnresolvablePlaceholders" value="true" /> 
     <property name="searchSystemEnvironment" value="false" /> 
     <property name="locations"> 
     <list> 
      <value>classpath:myapp-${env:prod}.properties</value> 
     </list> 
     </property> 
    </bean> 

env ise buna göre.

+0

İpliği tekrar okuyun. Özellikler DB'den yükleniyor. Soru şu, yapılandırmada başka bir yerde JVM argümanlarını nasıl kullanırım? – jinxed

+0

Sorunuzda gördüğüm şey şu: 'Ben bir çevre argümanıyla JVM'yi başlatıyorum (örneğin, -Denv = geliştirme) 'Ayrıca, düzenlediğiniz soruda, DB'nin bazı özelliklerini de okuduğunuzu belirttim. SADECE 1 kaynağından özelliklerin okunabileceği herhangi bir kısıtlama var mı? – anubhava

+0

Tüm özellikler veritabanından yüklenir. JVM argümanlarını çekmek için PropertyPlaceholderConfigurer kullanma kavramını anlıyorum, ancak PropertyPlaceholderConfigurer kullandığımda, başarıyla yüklenmiş olan DB özellikleri artık eksik. – jinxed

0

İlginçtir, Bahar PropertySources ile daha incelikle ele bu ihtiyaca gelişti: Birkaç yapılandırmaları ve bir Web uygulaması üzerinde çalışıyorsanız belki özel bir ApplicationInitializer ile http://spring.io/blog/2011/02/15/spring-3-1-m1-unified-property-management/

, mülk tutucu kolu Sistemi olabilir , Çevre ve özel özellikler. Spring, Spring yapılandırmanızda bulunduğunuzda kullanılan PropertySourcesPlaceholderConfigurer öğesini sağlar. Bu özellik, özellikler dosyalarınızdaki özellikleri, sonra Sistem'i ve son olarak Ortam'ı arayacaktır. 3.0.7

<context:property-placeholder location="classpath:${env:config-prd.properties}" /> 

Ve çalışma zamanı setine

0

Bahar: -Denv = config-dev.properties

"env" varsayılan "config-prd.properties" kullanacaktır Ayarlanmazsa

.

1

Kullanım #{systemProperties['env']} Temelde -DpropertyName=value gibi Java komut satırında kullanılan propertyName geçmektedir. Bu durumda -Denv=development kullanıldı.