Sin archivo de propiedades se encuentra el error de ReloadableResourceBundleMessageSource

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

  •  02-10-2019
  •  | 
  •  

Pregunta

Estoy tratando de utilizar un paquete de recursos de primavera recargable pero la primavera no puede encontrar el archivo. He intentado un montón de diferentes caminos, pero no puedo conseguir que en cualquier lugar de trabajo. En el siguiente código se verá que tanto me carga el paquete de la primavera y el regular de la misma variable de ruta, pero solo funciona.

He estado golpeando mi cabeza contra esto durante demasiado tiempo. Alguien tiene alguna idea?

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

¿Fue útil?

Solución

Sólo para el registro puede probar este método:

  1. declarar el grano reloadableResourceBundle con nombre base = .properties extensión 'mensajes' se asume y no requerido
  2. inyecte esta como referencia en su frijol
  3. crear el archivo messages.properties y colocar sus cosas en ella
  4. copiar messages.properties en YourProject / web / messages.properties
  5. reclinables y disfrutar

Explicación: Primavera mensaje recargable paquete no utiliza la ruta de clase, ya que llegar en caché de los servidores de aplicaciones. Es posible evitar este por la ruta de clase: your.properies pero por otra parte usted puede también utilizar la versión no recargable que está a pocos garrapatas más rápido. En otras palabras, el truco es usar el directorio webApp la que no consigue en caché. Usted puede colocar sus archivos bajo YourProject / web o cualquier parte de abajo, siempre y cuando usted deja que el conocimiento de la cargadora.

colocar esto en aplicación de web-config.xml

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

y esta es su café en grano:

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

@Autowired MessageSource ms;}

Y como JSF2 está realmente fresca es posible que desee utilizar esto en un contexto caras a continuación:

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

Otros consejos

Puede especificar el archivo de propiedades (s) estar fuera del archivo mediante la configuración en el archivo de contexto de aplicación, así:

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

Con ReloadableResourceBundleMessageSource se tiene que mover los archivos de mensajes de fuera de la ruta de clases si se quiere que sean realmente recargable. Si no se preocupan por la función recargable puede ponerlos en la ruta de clase y utilizar el prefijo 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>

acabo de cambiar a ReloadableResourceBundleMessageSource. Esto es trabajo para mí.

en lugar de leer desde un archivo, probablemente debería leer de la ruta de clases utilizando

Messages.class.getResourceAsStream("/path/from/classpathroot/messages.properties")
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top