6

Springのプロパティファイルに関連して発生している問題について、少し助けを求めていました。だから私が持っているセットアップは次のようなものです:

opto-mapping.properties –これは私のsrcフォルダーにあり、次のように最適化されたリソースの翻訳が含まれています。

generic-min.css=4037119659.css

このプロパティファイルは、ビルド「optimise」が実行されるたびに更新されます。次に使用します

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

プロパティファイルを目的のjspにインポートします。次に、以下を使用してコンテンツを参照します。

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

プロパティファイルを再ロードするためにTomcatの再起動が必要なことを除いて、これはすべてうまく機能します。リソースが更新されるたびにサイトの停止を開始する必要はありません。プロパティファイルを頻繁に自動的にリロードしたいのですが。

私はspring-context.xmlの既存のBeanを更新して、翻訳の場合と同じようにこのプロパティファイルをリロードしようとしましたが、これは機能しませんでした-おそらくopto-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。

4

3 に答える 3

5

お返事ありがとうございます。私は今これを機能させて、富を分かち合うと思いました。

そこで、プロパティファイルをsrcフォルダーからWEB-INF/propertiesに移動しました。

次の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を削除することでしたが、プロパティファイルがリロードされています。

再度、感謝します!

于 2010-11-11T16:53:32.387 に答える
4

Tomcat は、クラスパスにあるリソースをリロードしません。これは、次のjavadocに記載されていReloadableResourceBundleMessageSourceます。

通常、アプリケーション サーバーはクラスパスからロードされたすべてのファイルをキャッシュするため、リソースを別の場所 (たとえば、Web アプリの "WEB-INF" ディレクトリ) に保存する必要があります。そうしないと、クラスパス内のファイルの変更がアプリケーションに反映されません。

このようなクラスパスの場所には が含まれWEB-INF/classesており、リリースされません。

他の場所に移動してみてくださいopto-mapping.properties(例: WEB-INF/messages)。

于 2010-11-09T17:48:27.287 に答える
1

いくつか試してみることができます。

<fmt:setBundle>は最終的に を呼び出しますResourceBundle.getBundle(String, Locale, ClassLoader)。ここで、文字列はベース名になり、クラスローダーは になりますThread.currentThread().getContextClassLoader()。JDK 1.6 を使用している場合は、 を使用ResourceBundle.clearCache(ClassLoader)してバンドル キャッシュをクリアしてみてください。これをサーブレット フィルターで実行し、それを他のロジックと組み合わせて、キャッシュをクリアするタイミングを決定することは理にかなっています。

もう 1 つの角度は、プロパティ ファイルの読み込みと 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およびのドキュメントConfigJSTL APIにあります。

他にも多くのバリエーションが考えられますが、JDK 1.6 への新しいResourceBundle(を含むResourceBundle.Control) 追加を確認し、 のような「低レベル」API の機能を念頭に置いて、URLConnection利用可能な JSTL のよりプログラム的な側面に慣れてください。その API を介して。

于 2010-11-09T20:04:41.787 に答える