ReloadableresourceBundleMessagesOrceのエラーが見つかりませんでした
-
02-10-2019 - |
質問
リロード可能なスプリングリソースバンドルを使用しようとしていますが、スプリングはファイルを見つけることができません。私はたくさんの異なるパスを試しましたが、どこでも動作させることはできません。以下のコードでは、同じパス変数からスプリングバンドルと通常のバンドルの両方をロードしますが、1つの動作のみがロードされます。
私はあまりにも長い間これに対して頭を叩いてきました。誰かがアイデアを持っていますか?
logfile
INFO 2010-04-28 11:38:31,805 [main] org.myorg.test.TestMessages: C:\www\htdocs\messages.properties
INFO 2010-04-28 11:38:31,805 [main] org.myorg.data.Messages: initializing Spring Message Source to C:\www\htdocs\messages.properties
INFO 2010-04-28 11:38:31,821 [main] org.myorg.data.Messages: Attempting to load properties from C:\www\htdocs\messages.properties
DEBUG 2010-04-28 11:38:31,836 [main] org.springframework.context.support.ReloadableResourceBundleMessageSource: No properties file found for [C:\www\htdocs\messages.properties_en_US] - neither plain properties nor XML
DEBUG 2010-04-28 11:38:31,842 [main] org.springframework.context.support.ReloadableResourceBundleMessageSource: No properties file found for [C:\www\htdocs\messages.properties_en] - neither plain properties nor XML
DEBUG 2010-04-28 11:38:31,848 [main] org.springframework.context.support.ReloadableResourceBundleMessageSource: No properties file found for [C:\www\htdocs\messages.properties] - neither plain properties nor XML
INFO 2010-04-28 11:38:31,848 [main] org.myorg.test.TestMessages: I am C:\www\htdocs\messages.properties
messages.java
package org.myorg.data;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
public class Messages {
protected static final Log logger = LogFactory.getLog(Messages.class);
private static ReloadableResourceBundleMessageSource msgSource = null;
private static ResourceBundle RESOURCE_BUNDLE;
public static final String PATH = "C:" + File.separator + "www"
+ File.separator + "htdocs" + File.separator + "messages.properties";
private Messages() {
}
public static String getString(String key) {
initBundle();
return msgSource.getMessage(key, null,
RESOURCE_BUNDLE.getString(key), null);
}
private static void initBundle(){
if(null == msgSource || null == RESOURCE_BUNDLE){
logger.info("initializing Spring Message Source to " + PATH);
msgSource = new ReloadableResourceBundleMessageSource();
msgSource.setBasename(PATH);
msgSource.setCacheSeconds(1);
FileInputStream fis = null;
try {
logger.info("Attempting to load properties from " + PATH);
fis = new FileInputStream(PATH);
RESOURCE_BUNDLE = new PropertyResourceBundle(fis);
} catch (Exception e) {
logger.info("couldn't find " + PATH);
} finally {
try {
if(null != fis)
fis.close();
} catch (IOException e) {
}
}
}
}
}
testmessages.java
package org.myorg.test;
import org.myorg.data.Messages;
public class TestMessages extends AbstractTest {
public void testMessage(){
logger.info(Messages.PATH);
logger.info(Messages.getString("OpenKey.TEST"));
}
}
解決
レコードのためだけに、このアプローチを試すことができます。
- basename = 'messages' .properties拡張機能を備えたreloadableresourcebundle beanを宣言する
- これを豆に参照として注入します
- messages.propertiesファイルを作成し、その中に物を置きます
- messages.propertiesをproject/web/messages.propertiesにコピーします
- 横になって楽しんでください
説明:スプリングリロード可能なメッセージバンドルは、アプリサーバーによってキャッシュされているため、クラスパスを使用しません。 ClassPath:Your.Properiesによってこれを回避することもできますが、再度は、いくつかのダニがより速くなることのない再耐えられないバージョンを使用することもできます。言い換えれば、トリックは、キャッシュされないWebAppディレクトリを使用することです。ローダーに知らせる限り、ファイルをProject/Webまたは下のどこにでも配置できます。
これをWebAppConfig.xmlに配置します
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="message"/>
<property name="cacheSeconds" value="1"/>
</bean>
そして、これはあなたの豆です:
public class YouBeanWithMsgReloadableResourceBundle {
public void yourMethod(){
String msg = ms.getMessage("your.memo.nic", null, "your default message", Locale.CANADA);
}
@Autowired MessageSource ms;}
そして、JSF2は本当にクールなものなので、顔のコンテキストでこれを使用することをお勧めします。
public void validate(FacesContext context, UIComponent component, Object value)
throws ValidatorException {
MessageSource ms = FacesContextUtils.getWebApplicationContext(context).getBean(MessageSource.class);
String msg = ms.getMessage("your.memo.nic", null, "your default message", Locale.CANADA);
}
他のヒント
次のように、アプリケーションコンテキストファイルで構成することにより、プロパティファイルをアーカイブの外側に指定できます。
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="defaultEncoding" value="UTF-8"/>
<property name="basenames">
<list>
<value>file:/whatever_your_file_path_is/messages/admin_i18n</value>
<value>file:/whatever_your_file_path_is/messages/customer_i18n</value>
</list>
</property>
</bean>
と ReloadableResourceBundleMessageSource
実際にリロード可能にしたい場合は、メッセージファイルをクラスパスから移動する必要があります。リロード可能な機能を気にしない場合は、それらをClassPathに入れて使用できます。 classpath:
プレフィックス。
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="defaultEncoding" value="UTF-8"/>
<property name="basenames">
<list>
<value>classpath:messages/admin_i18n</value>
<value>classpath:messages/customer_i18n</value>
</list>
</property>
</bean>
に切り替えます ReloadableResourceBundleMessageSource
. 。これは私のために働いています。
ファイルから読むのではなく、おそらくClassPathから読む必要があります
Messages.class.getResourceAsStream("/path/from/classpathroot/messages.properties")