SetBundleを使用してロードされるプロパティファイルのリロード
-
30-09-2019 - |
質問
私は、春にプロパティファイルを含む問題について少し助けを求めていました。だから私が持っているセットアップはそうです:
opto-mapping.properties - これは私のSRCフォルダーにあり、次のような最適化されたリソースの翻訳が含まれています。
generic-min.css=4037119659.css
この適切なファイルは、ビルド「Optimize」が実行されるたびに更新されます。次に使用します
<fmt:setBundle basename="opto-mapping" />
私の希望のJSPに私のプロパティファイルをインポートします。次に、以下を使用してコンテンツを参照します。
<fmt:message key='generic-min.css' />
これはすべて、プロパティファイルがリロードするためにTomcatの再起動を必要とすることを除いて、美しく機能します。リソースが更新されるたびにサイトを削除し始めたくありません。プロパティファイルを頻繁に自動的にリロードしたいと思います。
spring -context.xmlの既存のBeanを更新して、翻訳と同じようにこのプロパティファイルをリロードしようとしましたが、これは機能していません。poto -mapping.propertiesファイルの場所のためにおそらく機能しますが、必要ですFMT:SetBundleを使用してロードする場所にいる。
<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>
この困難な時期には、正しい方向の助けやポイントが大歓迎されます。
私はこれがすべて前もってセニーズであり、多くの感謝をすることを願っています!
G.
解決
試してみるかもしれないことがいくつかあります。
<fmt:setBundle>
最終的に電話します ResourceBundle.getBundle(String, Locale, ClassLoader)
, 、文字列はあなたのベースネームになり、クラスローダーは Thread.currentThread().getContextClassLoader()
. 。 JDK 1.6を使用している場合は、使用してみてください ResourceBundle.clearCache(ClassLoader)
バンドルキャッシュをクリアする。サーブレットフィルターでこれを行い、それを他のロジックと組み合わせて、キャッシュをいつクリアするかを判断することは理にかなっています。
別の角度は、プロパティファイルの読み込みとJSTLの構成をより直接的に制御することです。繰り返しますが、フィルターを使用します(例外処理を無視します):
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);
その後、使用することができます <fmt:message>
あなたのページで。ドキュメントを見つけることができます LocalizationContext
と Config
の中に JSTL API.
他の多くのバリエーションが可能ですが、必ず新しいものを見てください ResourceBundle
(含む ResourceBundle.Control
)JDK 1.6への追加、「下位レベル」APIの機能に留意してください URLConnection
, 、そして、APIを通じて利用可能なJSTLのよりプログラム的な側面に精通します。
他のヒント
両方の回答をありがとう。私は今、これを働いており、富を共有すると思っていました。
そこで、プロパティファイルをSRCフォルダーからWeb-INF/プロパティに移動しました。
次のBeanを更新して、プロパティファイルをロードしました。
<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>
今、以前はSetBundleを使用してこのようなプロパティファイルにロードしていました。
<fmt:setBundle basename="opto-mapping" />
しかし、私は明らかに、私のプロパティファイルがそれを動かしたので、もうロードされていないことがわかりました。しかし、私のBeanのセットアップのために、新しいプロパティファイルはロードされていましたが、私のSetBundleはそれを上書きしていました。
そのため、解決策はSetBundleを削除することであり、これで私のプロパティファイルはリロードされています!
再度、感謝します!
Tomcatは、ClassPathにあるリソースをリロードしません。これはに記載されています Javadoc にとって ReloadableResourceBundleMessageSource
:
アプリケーションサーバーは通常、ClassPathからロードされたすべてのファイルをキャッシュするため、リソースをどこかに保存する必要があります(たとえば、Webアプリの「Web-INF」ディレクトリに)。それ以外の場合、クラスパス内のファイルの変更はアプリケーションに反映されません。
このようなClassPathの場所には含まれます WEB-INF/classes
, 、そしてリリースされません。
動いてみてください opto-mapping.properties
他の場所(例: WEB-INF/messages
)、そしてそれを試してみてください。