لم يتم العثور على ملف خصائص خطأ لإعادة التشغيل

StackOverflow https://stackoverflow.com/questions/2732280

  •  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"));
        }
}

هل كانت مفيدة؟

المحلول

فقط للسجل يمكنك تجربة هذا النهج:

  1. إعلان أن RELOADABLERESORCEBUNDLE BEAN مع basename = 'الرسائل'.
  2. حقن هذا كمرجع في الفول
  3. إنشاء رسائل.
  4. نسخ الرسائل.
  5. استلقي واستمتع

تفسير:لا تستخدم حزمة الرسائل القابلة لإعادة التحميل الربيع مسار الفئة لأنه يتم تخزينه مؤقتًا بواسطة خوادم التطبيق. يمكنك التحايل على هذا حسب 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")
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top