Aucun fichier de propriétés trouvé erreur pour ReloadableResourceBundleMessageSource

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

  •  02-10-2019
  •  | 
  •  

Question

Je suis en train d'utiliser un ensemble de ressources de printemps mais le printemps peut reloadable trouver le fichier. J'ai essayé des tonnes de chemins différents, mais ne peut pas le faire fonctionner partout. Dans le code ci-dessous, vous verrez que je charge à la fois le faisceau de ressort et une régulière de la même variable de chemin, mais seulement une des œuvres.

J'ai été cogne la tête contre cela pour beaucoup trop longtemps. Tout le monde a des idées?

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

Était-ce utile?

La solution

Pour le compte rendu, vous pouvez essayer cette approche:

  1. déclarer la fève reloadableResourceBundle avec basename = extension .properties 'messages est supposé et non requis
  2. inject cela comme référence dans votre bean
  3. créer fichier messages.properties et placez vos trucs dedans
  4. copier messages.properties dans YourProject / web / messages.properties
  5. retour laïque et profiter

Explication: faisceau de ressort de message ne pas utiliser reloadable chemin de classe comme get mises en cache par les serveurs d'applications. Vous pouvez contourner cela en classpath: your.properies mais là encore, vous pouvez aussi bien utiliser la version non rechargeable qui est quelques tiques plus rapidement. Autrement dit, l'astuce consiste à utiliser le répertoire webapp qui ne soit pas mis en mémoire cache. Vous pouvez placer vos fichiers sous YourProject / web ou partout ci-dessous aussi longtemps que vous laissez le savoir chargeur.

placer dans webapp-config.xml

<bean id="messageSource"  class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="message"/>
    <property name="cacheSeconds" value="1"/>
</bean>

et ceci est votre bean:

public class YouBeanWithMsgReloadableResourceBundle {
    public void yourMethod(){
    String msg = ms.getMessage("your.memo.nic", null, "your default message", Locale.CANADA);
}

@Autowired MessageSource ms;}

Et puisque JSF2 est vraiment cool choses que vous pouvez utiliser dans un contexte de visages alors:

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

Autres conseils

Vous pouvez spécifier le fichier de propriétés (s) en dehors de l'archive en configurant dans le fichier de contexte d'application comme ceci:

<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>

Avec ReloadableResourceBundleMessageSource vous devez déplacer les fichiers de messages de la classpath si vous voulez qu'ils soient effectivement reloadable. Si vous ne vous inquiétez pas pour la fonction reloadable vous pouvez les mettre dans le classpath et utiliser le préfixe 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>

Je passe juste ReloadableResourceBundleMessageSource. Cela fonctionne pour moi.

plutôt que de lire à partir d'un fichier, vous devriez lire probablement du classpath en utilisant

Messages.class.getResourceAsStream("/path/from/classpathroot/messages.properties")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top