Frage

Ich versuche, ein aufladbare Feder Ressourcenbündel zu verwenden, aber der Frühling die Datei nicht finden kann. Ich habe versucht, jede Menge verschiedenen Wege, aber kann es nicht zur Arbeit überall. Im folgenden Code werden Sie sehen, dass ich Bündel sowohl die Federkraft und die regelmäßigen einer aus dem gleichen Pfad-Variable aber nur eine funktioniert.

Ich habe schlug meinen Kopf gegen das viel zu lange. Jemand irgendwelche Ideen?

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

War es hilfreich?

Lösung

Nur für das Protokoll können Sie versuchen, diesen Ansatz:

  1. erklären die reloadableResourceBundle Bean mit base = ‚Nachrichten‘ Erweiterung .properties angenommen wird, und nicht erforderlich
  2. inject diese als Referenz in der Bohne
  3. messages.properties-Datei erstellen und platzieren Sie Ihre Sachen in der es
  4. Kopieren messages.properties in IhrProjekt / web / messages.properties
  5. lag zurück und genießen

Erklärung: Frühling aufladbare Nachricht Bündel nicht verwendet Klassenpfad nicht, wie es die von App-Servern zwischengespeichert bekommen. Sie können dies durch Classpath umgehen: your.properies aber dann wieder können Sie auch die nicht aufladbare Version verwenden, die ein paar Ticks schneller ist. Mit anderen Worten ist der Trick, um das webApp Verzeichnis zu verwenden, die im Cache erhalten nicht. Sie können Ihre Dateien unter IhrProjekt / Web oder irgendwo unten so lange platzieren, wie Sie die Lader wissen lassen.

setzt diese in Webapp-config.xml

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

und das ist Ihr Bean:

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

@Autowired MessageSource ms;}

Und da JSF2 wirklich Sachen abkühlen Sie können diesen Zusammenhang in einer Gesicht dann verwenden:

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

Andere Tipps

Sie können die Eigenschaften Datei (en) außerhalb des Archivs werden, indem wie so im Anwendungskontext Konfiguration der Datei:

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

Mit ReloadableResourceBundleMessageSource müssen Sie die Nachrichtendateien aus dem Classpath bewegen, wenn Sie wollen, aufladbare tatsächlich sein. Wenn Sie nicht für die nachladbare Funktion kümmern können Sie sie in dem Classpath setzen und den classpath: Präfix verwenden.

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

Ich schalte einfach zu ReloadableResourceBundleMessageSource. Dies funktioniert für mich.

anstatt aus einer Datei lesen, sollten Sie wahrscheinlich aus dem Classpath lesen mit

Messages.class.getResourceAsStream("/path/from/classpathroot/messages.properties")
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top