Файл свойств не найден Ошибка для ReloadableResourceBundleMessageSource - PullRequest
1 голос
/ 28 апреля 2010

Я пытаюсь использовать перезагружаемый пакет ресурсов 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

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

Ответы [ 4 ]

2 голосов
/ 18 мая 2013

Вы можете указать файлы свойств вне архива, сконфигурировав их в файле контекста приложения следующим образом:

<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>
2 голосов
/ 26 января 2011

Только для записи вы можете попробовать этот подход:

  1. объявляет bean-компонент reloadableResourceBundle с basename = 'messages'. Расширение .properties предполагается и не требуется
  2. введите это как ссылку в ваш бин
  3. создайте файл messages.properties и поместите в него свои вещи
  4. скопируйте messages.properties в yourProject / web / messages.properties
  5. расслабься и наслаждайся

Пояснение: Перезаряжаемый пакет сообщений Spring не использует путь к классам, поскольку он кэшируется серверами приложений. Вы можете обойти это с помощью classpath: your.properies, но с другой стороны вы также можете использовать не перезагружаемую версию, которая на несколько тиков быстрее. Другими словами, хитрость заключается в том, чтобы использовать каталог webApp, который не кэшируется. Вы можете поместить свои файлы в свой проект / в Интернет или где-нибудь ниже, если вы сообщите загрузчику.

поместите это в 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);
}
1 голос
/ 09 сентября 2011

С 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. Это работает для меня.

0 голосов
/ 29 апреля 2010

вместо чтения из файла, вы, вероятно, должны читать из classpath, используя

Messages.class.getResourceAsStream("/path/from/classpathroot/messages.properties")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...