لم يتم العثور على ملف خصائص خطأ لإعادة التشغيل
-
02-10-2019 - |
سؤال
أحاول استخدام حزمة موارد Spring قابلة لإعادة التحميل ولكن لا يمكن لـ Spring العثور على الملف. لقد جربت الكثير من المسارات المختلفة ، لكن لا يمكنني تشغيلها في أي مكان. في الكود أدناه ، سترى أنني أقوم بتحميل كل من حزمة الربيع والمعتاد من متغير المسار نفسه ولكن واحد يعمل فقط.
لقد كنت أضرب رأسي ضد هذا لفترة طويلة جدًا. أي شخص يمتلك أي أفكار؟
ملف تسجيل
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
الرسائل. 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"));
}
}
المحلول
فقط للسجل يمكنك تجربة هذا النهج:
- إعلان أن RELOADABLERESORCEBUNDLE BEAN مع basename = 'الرسائل'.
- حقن هذا كمرجع في الفول
- إنشاء رسائل.
- نسخ الرسائل.
- استلقي واستمتع
تفسير:لا تستخدم حزمة الرسائل القابلة لإعادة التحميل الربيع مسار الفئة لأنه يتم تخزينه مؤقتًا بواسطة خوادم التطبيق. يمكنك التحايل على هذا حسب classpath: الخاص بك. وبعبارة أخرى ، فإن الحيلة هي استخدام دليل الويب الذي لا يتم تخزينه مؤقتًا. يمكنك وضع ملفاتك تحت yourproject/الويب أو في أي مكان أدناه طالما سمحت لوكيل المعرفة.
ضع هذا في webapp-config.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);
}
نصائح أخرى
يمكنك تحديد ملفات (ملفات) الخصائص خارج الأرشيف من خلال التكوين في ملف سياق التطبيق مثل SO:
<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 واستخدامها 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")