2010-11-09 13 views
6

kullanarak yüklenen özellikler dosyasının yeniden yüklenmesi Bir sorunla ilgili olarak Spring'deki özellik dosyalarını dahil etmeyi umuyorum. Yani var kurulum böylece gibidir:setBundle

opto-mapping.properties - Bu benim src klasöründe bulunur ve böylece gibi benim optimize kaynaklar için çeviriler içeriyor:

generic-min.css=4037119659.css 

Bu dosya güncellenir properies her zaman yapı 'optimize' çalıştırılır. Daha sonra, özellikleri dosyamı istenen jsp'ye almak için kullanıyorum. Sonra kullanarak içeriğe başvuruda:

<fmt:message key='generic-min.css' /> 

Bu tüm inşaat güzelce özellikler dosyası bir kedi yeniden yüklenmesi yeniden gerektirdiğini hariç. Bir kaynak güncellendiğinde her zaman siteleri almaya başlamak istemiyorum. Özellikler dosyasının her sık ​​sık otomatik olarak yeniden yüklenmesini istiyorum.

Bu özellik dosyasını çevirilerle yaptığım gibi yeniden yüklemek için spring-context.xml dosyasında varolan bir fasulyeyi güncelleştirmeyi denedim ama bu çalışmadı - opto-mapping.properties dosyalarının konumu nedeniyle daha fazla - ama fmt: setBundle kullanarak yüklemek için bu konumda olması gerektiğini görüyorsunuz.

<bean id="messageSource" 
     class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
     <property name="cacheSeconds"> 
      <value>1</value> 
     </property> 
     <property name="basenames"> 
      <list> 
       <value>WEB-INF/translations/translations</value> 
       <value>WEB-INF/classes/opto-mapping</value> 
      </list> 
     </property> 
</bean> 

Bu zor zamanda, herhangi bir yardım veya doğru yönde herhangi bir nokta büyük ölçüde takdir edilecektir.

Umarım tüm bunlar şimdiden seneler ve çok teşekkürler!

G.

cevap

1

Denemeniz gereken birkaç şey var.

<fmt:setBundle> sonunda dize senin basename olacak ResourceBundle.getBundle(String, Locale, ClassLoader), arayacak ve classloader Thread.currentThread().getContextClassLoader() olacaktır. JDK 1.6 kullanıyorsanız, paket önbelleğini temizlemek için ResourceBundle.clearCache(ClassLoader) kullanmayı deneyebilirsiniz. Bir servlet filtresinde bunu yapmak ve önbelleğin ne zaman temizleneceğini belirlemek için başka bir mantıkla birleştirmek mantıklı olacaktır.

Bir başka açı, özellik dosyasının yüklenmesi ve JSTL'nin yapılandırılması üzerinde daha doğrudan bir kontrol gerektirir.Yine, bir filtre yapım kullanmak (istisna durumları hariç):

ClassLoader ctxLoader = Thread.currentThread().getContextClassLoader(); 
URL propsURL = ctxLoader.getResource("opto-mapping.properties"); 
URLConnection propsConn = propsURL.openConnection(); 
long propsLastModified = propsConn.getLastModified(); 
// decide if you want to reload... 
propsConn.setUseCaches(false); 
InputStream propsIn = propsConn.getInputStream(); 
ResourceBundle propsBundle = new PropertyResourceBundle(propsIn); 
propsIn.close(); 
LocalizationContext propsCtx = new LocalizationContext(propsBundle); 
ServletContext servletCtx = this.filterConfig.getServletContext(); 
Config.set(servletCtx, Config.FMT_LOCALIZATION_CONTEXT, propsCtx); 

Sonra sadece sayfalarınıza <fmt:message> kullanabilirsiniz. LocalizationContext ve Config belgelerini JSTL API'da bulabilirsiniz. diğer varyasyonların

sürü mümkündür, ancak, 1.6 JDK için yeni ResourceBundle (dahil ResourceBundle.Control) eklemeler bakmak URLConnection gibi akılda "alt düzey" API'ler işlevselliğini tutmak ve aşina olmak için emin olun JSTL'nin API aracılığıyla daha fazla programatik yönü.

4

Tomcat üzerinde sınıf olan kaynakları yeniden olmayacaktır. Bu belirtilmiştir javadocReloadableResourceBundleMessageSource için:

uygulama sunucuları genellikle sınıfyolundan yüklenen tüm dosyaları önbelleğe bu yana, (başka bir yere saklamak kaynaklarına gereklidir örneğin bir web "WEB-INF" dizininde Uygulama). Aksi takdirde, sınıf yolundaki dosyaların değişiklikleri uygulamaya yansıtılmaz.

Böyle bir sınıf yolu konumları WEB-INF/classes içerir ve serbest bırakılmaz.

Başka yerde (örn. WEB-INF/messages) hareket etmeyi deneyin ve sonra deneyin.

+0

Harika, geri bildiriminiz için çok teşekkür ederim. Ben sadece bu özellik dosyamı yükleme yolu ile ( kullanarak) bir sorun neden olmaz umuyoruz. –

+0

Yarın bu işe gideceğim ve bulgularımı buraya yükleyeceğim. Teşekkürler! –

5

Yanıtlarınız için ikinize de teşekkür ederiz. Bu çalışmayı aldım ve serveti paylaşacağımı düşündüm.

Özellikler dosyamı src klasöründen ve WEB-INF/özelliklerine taşıdım.

Ben özellikleri dosyaları yüklemek için aşağıdaki fasulye güncellenmiş

:

<fmt:setBundle basename="opto-mapping" /> 

Ama bunu buldum: Daha önce benim özelliklerine içine yüklemek için setBundle kullanıyordum Şimdi

<bean id="messageSource" 
     class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
     <property name="cacheSeconds"> 
      <value>1</value> 
     </property> 
     <property name="basenames"> 
      <list> 
       <value>WEB-INF/translations/translations</value> 
       <value>WEB-INF/properties/opto-mapping</value> 
      </list> 
     </property> 
    </bean> 

böyle dosyası Açıkçası benim özellikleri dosya artık yüklenmemişti çünkü ben taşınmıştı. Fakat fasulyem kurulumundan dolayı yeni özellikler dosyası yükleniyordu ama setBundle'm bunun üzerine yazıyordu.

Yani, çözüm setBundle'ı kaldırmaktı ve şimdi dosyam dosyam yeniden yükleniyor!

Tekrar teşekkürler!