it-swarm.com.de

ResourceBundle für MessageSource nicht gefunden, wenn es sich in einem Ordner befindet

Ich versuche, Ressourcenpakete mit Spring Message Source zu verwenden. So mache ich es:

@Component
public class MessageResolver implements MessageSourceAware {

    @Autowired
    private MessageSource messageSource;

    public void setMessageSource(MessageSource messageSource) {
        this.messageSource = messageSource;
    }

    public String getMessage(){
        return messageSource.getMessage("user.welcome", new Object[]{"Rama"} , Locale.US);
    }

}

Und hier ist meine Ordnerstruktur:

enter image description here

messages_en_US.properties enthält nur eine Zeile:

user.welcome=Welcome {0}

Hier ist die verwendete XML-Konfiguration:

<bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename">
        <value>resourcebundles/messages</value>
    </property>
</bean>

Hier ist der Fehler, den ich erhalte:

WARNING: ResourceBundle [resourcebundles/messages] not found for MessageSource: Can't find bundle for base name resourcebundles/messages, locale en_US
Exception in thread "main" org.springframework.context.NoSuchMessageException: No message found under code 'user.welcome' for locale 'en_US'.

Wenn ich mein Ressourcenpaket direkt unter den Ressourcenordner verschiebe, funktioniert es einwandfrei. In diesem Fall ist hier die XML-Konfiguration, die ich verwende:

<bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename">
    <value>messages</value>
</property>

Muss ich ResourceBundleMessageSource verwenden, sollte ich meine Ressourcenpakete direkt unter den Ressourcen ablegen? Wenn ich es nur im angegebenen Ordner aufbewahren muss, gibt es eine andere Möglichkeit, dieses eine Arbeit zu erhalten?

Vielen Dank!

10
Prasanth

Ändern Sie Ihre Konfiguration für messageSource-Bean in Ihrer XML-Datei wie folgt.

<bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basename"> 
        <value>classpath*:resourcebundles/messages</value> 
    </property> 
</bean>

Da sich alle Ihre Eigenschaftendateien im Klassenpfad von Java befinden, müssen Sie den Pfad mit dem Präfix classpath*: definieren. Andernfalls wird das Webverzeichnis Ihrer Anwendung durchsucht.

Hoffe das hilft dir. Prost.

11
Japan Trivedi

junge, vielleicht können Sie die XML-Konfiguration wie folgt ändern:

benutzen 

org.springframework.context.support.ReloadableResourceBundleMessageSource

anstatt

org.springframework.context.support.ResourceBundleMessageSource

alle Konfiguration wie folgt:

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:resourcebundles/messages" />
    <property name="useCodeAsDefaultMessage" value="true" />
</bean>
17
jis117

Es ist jetzt fast 2015 und ich verwende Spring 4.1.2.RELEASE. Es gibt definitiv ein Problem mit der Art und Weise, in der die MessageSource-Bean konfiguriert werden muss, damit das Zielressourcenpaket aufgenommen wird. 

1) Wenn das Bean messageSource vom Typ ReloadableResourceBundleMessageSource ist, funktioniert es nicht:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;

@Configuration
@ComponentScan(basePackages = { "com.intertech.service" })
//@ImportResource({"classpath:spring/applicationContext-i18n.xml"})
public class AppConfig {

  @Bean(name = "messageSource")
  public ReloadableResourceBundleMessageSource getMessageSource() {
      ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
      messageSource.setBasename("config/messages");
      messageSource.setDefaultEncoding("UTF-8");
      messageSource.setUseCodeAsDefaultMessage(true);
      return messageSource;
  }

//  @Bean(name = "messageSource")
//  public ResourceBundleMessageSource getMessageSource() {
//      ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
//      messageSource.setBasename("config/messages");
//      messageSource.setDefaultEncoding("UTF-8");
//      messageSource.setUseCodeAsDefaultMessage(true);
//      return messageSource;
//  }
}

2) Wenn das messageSource-Bean vom Typ ResourceBundleMessageSource ist, funktioniert es:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;

@Configuration
@ComponentScan(basePackages = { "com.intertech.service" })
//@ImportResource({"classpath:spring/applicationContext-i18n.xml"})
public class AppConfig {

//  @Bean(name = "messageSource")
//  public ReloadableResourceBundleMessageSource getMessageSource() {
//      ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
//      messageSource.setBasename("config/messages");
//      messageSource.setDefaultEncoding("UTF-8");
//      messageSource.setUseCodeAsDefaultMessage(true);
//      return messageSource;
//  }

  @Bean(name = "messageSource")
  public ResourceBundleMessageSource getMessageSource() {
      ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
      messageSource.setBasename("config/messages");
      messageSource.setDefaultEncoding("UTF-8");
      messageSource.setUseCodeAsDefaultMessage(true);
      return messageSource;
  }
}

3) Wenn Sie eine XML-Konfigurationsdatei verwenden, die mit einer Konfigurationsklasse kombiniert ist, funktioniert sie (beachten Sie, wie das Basispaket in einer Klasse wie die Qualifizierungsmethode konfiguriert ist, z. B. 'config.messages' nicht 'config/messages') -i18n.xml)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="messageSource"
        class="org.springframework.context.support.ResourceBundleMessageSource"
        p:basename="config.messages"
        p:useCodeAsDefaultMessage="true"/>

    <!-- This will not work -->
    <!--
    <bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource"
        p:basename="config/messages"
        p:useCodeAsDefaultMessage="true"/>
     -->
</beans>

und:

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

@Configuration
@ComponentScan(basePackages = { "com.intertech.service" })
@ImportResource({"classpath:spring/applicationContext-i18n.xml"})
public class AppConfig {

//  @Bean(name = "messageSource")
//  public ReloadableResourceBundleMessageSource getMessageSource() {
//      ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
//      messageSource.setBasename("config/messages");
//      messageSource.setDefaultEncoding("UTF-8");
//      messageSource.setUseCodeAsDefaultMessage(true);
//      return messageSource;
//  }

//  @Bean(name = "messageSource")
//  public ResourceBundleMessageSource getMessageSource() {
//      ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
//      messageSource.setBasename("config/messages");
//      messageSource.setDefaultEncoding("UTF-8");
//      messageSource.setUseCodeAsDefaultMessage(true);
//      return messageSource;
//  }
}

4) Am wichtigsten ... Wenn Sie einen WebApplicationInitializer (keine web.xml) verwenden, müssen Sie die Konfigurationsklasse registrieren, die die Bean 'messageSource' definiert, und nicht im Dispatcher Servlet-Kontext:

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

public class WebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) throws ServletException {
    // Create the 'root' Spring application context
    AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
    rootContext.register(AppConfig.class);
    // Manage the lifecycle of the root application context
    container.addListener(new ContextLoaderListener(rootContext));
    // Create the dispatcher servlet's Spring application context
    AnnotationConfigWebApplicationContext dispatcherServlet = new AnnotationConfigWebApplicationContext();
    dispatcherServlet.register(MvcConfig.class);
    // Register and map the dispatcher servlet
    ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(
            dispatcherServlet));
    dispatcher.setLoadOnStartup(1);
    dispatcher.addMapping("*.htm");
    }
}
6
Tom Silverman

In meinem Fall musste ich mit Spring 4.3.2.RELEASE und Java config und einer ReloadableResourceBundleMessageSource - meine Template Engine als Bean definieren, da sonst meine Nachrichten nicht aufgelöst wurden.

Hier ist ein Beispiel einer funktionierenden Konfiguration.

AppConfig.Java

import Java.util.concurrent.TimeUnit;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.spring4.SpringTemplateEngine;
import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring4.view.ThymeleafViewResolver;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ITemplateResolver;

@Configuration
@EnableWebMvc
@ComponentScan("myapp")
public class AppConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware {

private ApplicationContext applicationContext;

private static final boolean CACHE_THYMELEAF_TEMPLATES = false;
private final String UTF8_ENCODING = "UTF-8";

@Override
public void setApplicationContext(ApplicationContext applicationContext) {
    this.applicationContext = applicationContext;
}

@Bean
public ViewResolver viewResolver() {
    ThymeleafViewResolver resolver = new ThymeleafViewResolver();
    resolver.setTemplateEngine(templateEngine());
    resolver.setCharacterEncoding(UTF8_ENCODING);
    resolver.setCache(CACHE_THYMELEAF_TEMPLATES);
    return resolver;
}

@Bean
public TemplateEngine templateEngine() {
    //this method must be defined as a bean otherwise i18n messages are not found
    //if method defined as private TemplateEngine templateEngine() messages are not found
    SpringTemplateEngine engine = new SpringTemplateEngine();
    engine.setEnableSpringELCompiler(true);
    engine.addTemplateResolver(templateResolver());
    return engine;
}

private ITemplateResolver templateResolver() {
    SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
    resolver.setApplicationContext(applicationContext);
    resolver.setPrefix("/WEB-INF/thymeleaf/");
    resolver.setTemplateMode(TemplateMode.HTML);
    resolver.setSuffix(".html");
    resolver.setCacheable(CACHE_THYMELEAF_TEMPLATES);
    resolver.setCharacterEncoding(UTF8_ENCODING);
    return resolver;
}   

@Bean
public MessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasenames("WEB-INF/i18n/messages");
    messageSource.setUseCodeAsDefaultMessage(true);
    messageSource.setDefaultEncoding(UTF8_ENCODING);
    messageSource.setFallbackToSystemLocale(false);
    messageSource.setCacheSeconds((int)TimeUnit.HOURS.toSeconds(1));
    return messageSource;
}

}
2
Timothy Anyona

YAML-Version dafür

  spring:
     messages:
       basename: i18n/validation, i18n/message # for multiple properties just use comma separated values
       encoding: UTF-8

Sie können sich auf documentation beziehen, um eine vollständige Beschreibung zu erhalten.

Ich sollte auch erwähnen, dass die Standardvariable MessageSource bean eine ResourceBundleMessageSource ist, die bereits aus einem Klassenpfad liest, so dass es nicht notwendig ist, eine Nonation wie classpath:i18n/validation zu verwenden.

Verzeichnisaufbau

 enter image description here

0
Edgar Asatryan
 <!-- Application Message Bundle -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="resourcebundles/messages" />
</bean>

Sie müssen den Nachrichtenpfad wie oben gezeigt konfigurieren. __ Überprüfen Sie auch den Klassennamen.

0
Sachin J

Was für mich funktionierte, war etwas wirklich einfaches.

Es war 

<property name="basename">
            <value>locale\messages</value>
        </property>

Ich habe es geändert

<property name="basename">
            <value>locale/messages</value>
        </property>

Nur ein \/Änderung hat es für mich behoben. Ich verwende einen MAC.

Ich habe *classpath nicht ausprobiert, das hat bei mir nicht funktioniert.

0
Siddharth

Ich habe folgende Konfiguration verwendet, und es funktioniert einwandfrei in meinem Projekt . Meine messages.properties befindet sich im Pfad unter: ..\WebContent\WEB-INF\resources

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:WEB-INF/resources/messages" />
    <property name="useCodeAsDefaultMessage" value="true" />
</bean>
0
Ganesh Teltia

Ich habe folgende Konfiguration verwendet und es funktioniert gut

<beans:bean id="messageSource class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <beans:property name="basename" value="classpath:resourcebundles/ScreenLabelResources" />
    </beans:bean>
0
Sanchi Girotra

Ich habe folgende Konfiguration verwendet und es funktioniert gut in meinem Projekt.

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:configurations/messages" />
    <property name="useCodeAsDefaultMessage" value="true" />
</bean>

ort: src\main\resources\configurations\messages_en.properties

0