【问题标题】:ReloadableResourceBundleMessageSource not workingReloadableResourceBundleMessageSource 不工作
【发布时间】:2015-06-25 07:27:17
【问题描述】:

目前我正在开发一个没有 XML bean 文件的新 Spring 4 + Thymeleaf + Security 项目。不知何故,本地化属性文件没有加载,我在日志文件中找不到任何关于它们的信息。

/**
 * Generates the i18n language loader.
 *
 * @return
 */
@Bean(name="messageSource")
public ReloadableResourceBundleMessageSource messageSource() {
    ReloadableResourceBundleMessageSource resource = new ReloadableResourceBundleMessageSource();
    resource.setBasename("classpath:messages");
    resource.setDefaultEncoding("UTF-8");
    resource.setUseCodeAsDefaultMessage(true);
    resource.setFallbackToSystemLocale(false);
    return resource;
}

/**
 * Generates the i18n language changer parameter.
 *
 * @return
 */
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
    LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
    localeChangeInterceptor.setParamName("language");
    return localeChangeInterceptor;
}

/**
 * Genereates the default i18n language.
 *
 * @return
 */
@Bean(name = "localeResolver")
public SessionLocaleResolver localeResolver() {
    SessionLocaleResolver localeResolver = new SessionLocaleResolver();
    localeResolver.setDefaultLocale(new Locale("en"));
    return localeResolver;
}

/**
 * Generates the template resolver for thymeleaf.
 *
 * @return
 */
@Bean
public ServletContextTemplateResolver templateResolver() {
    ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".html");
    resolver.setTemplateMode("HTML5");
    resolver.setCacheable(false);
    return resolver;

}

/**
 * Generates the template engine for thymeleaf.
 *
 * @return
 */
public SpringTemplateEngine templateEngine() {
    SpringTemplateEngine engine = new SpringTemplateEngine();
    engine.setTemplateResolver(templateResolver());
    engine.addDialect(new SpringSecurityDialect());
    return engine;
}

/**
 * Generates the view resolver from Spring MVC with thymeleaf intergrated.
 *
 * @return
 */
@Bean
public ViewResolver viewResolver() {
    ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    viewResolver.setTemplateEngine(templateEngine());
    viewResolver.setOrder(1);
    viewResolver.setViewNames(new String[]{"*"});
    viewResolver.setCache(false);
    return viewResolver;
}

/**
 * Add resources.
 *
 * @param registry
 */
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/assets/**").addResourceLocations("/WEB-INF/assets/");
}

/**
 * Add interceptors.
 * 
 * @param registry 
 */
@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(localeChangeInterceptor());
}

src/main/resources/ 文件夹中的文件名:

  • messages.properties
  • messages_en.properties
  • messages_nl.properties

有谁能帮帮我吗?

【问题讨论】:

    标签: spring hibernate spring-mvc spring-security thymeleaf


    【解决方案1】:

    ReloadableResourceBundleMessageSource 的基本名称模式中缺少表示类路径根目录的斜线字符“/”。

    resource.setBasename("classpath:/messages");
    

    【讨论】:

    • 已经尝试过这样做,但没有解决为什么我要问这个问题:) 我迷失了可能的错误
    • 为什么其中一个消息文件没有语言环境?常规捆绑包有用吗?
    • 为什么其中一个消息文件没有语言环境? - 仅用于测试目的以检查它是否有效...常规 ResourceBundleMessageSource bean 也不起作用
    • 如何构建应用程序?是否包含所有资源?只是为了确保 - 您是否使用包含所有捆绑包的已部署 .war 文件?
    • 是的,一切都包括在内,最奇怪的是他没有从 spring 库中触发 loadProperties() 方法等
    【解决方案2】:

    Javabase 配置:

    @Configuration
    @EnableWebMvc
    public class AppConfig extends WebMvcConfigurerAdapter {
    
           @Bean
           public MessageSource messageSource() {
                 ReloadableResourceBundleMessageSource messageSource = new
                        ReloadableResourceBundleMessageSource();
                 messageSource.setBasename("classpath:messages");
                 messageSource.setCacheSeconds(10);
                 return messageSource;
           }
    
           @Bean
           public LocalValidatorFactoryBean localValidatorFactoryBean() {
                  LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean();
                  factoryBean.setValidationMessageSource(messageSource());
                  return factoryBean;
            }
    
            @Override
            public Validator getValidator() {
                  return localValidatorFactoryBean();
            }
     }
    

    XmLbase 配置:

    注意:你应该已经添加了 mvc 命名空间。

    <mvc:annotation-driven validator="validatorFactoryBean"/>
    
    <bean id="messageSource"
          class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="classpath:messages"/>
    </bean>
    
    <bean id="validatorFactoryBean"
          class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="validationMessageSource" ref="messageSource"/>
    </bean>
    

    注意:如果您尝试从“webapp”文件夹加载,则无需使用“classpath:”前缀。

    【讨论】:

      【解决方案3】:

      我需要为我的开发环境进行以下配置:

      application.properties:

      spring.messages.basename=file:src/main/resources/messages
      spring.messages.cache-duration=0
      

      Java 配置:

      @Bean
      @ConfigurationProperties(prefix = "spring.messages")
      public MessageSourceProperties messageSourceProperties() {
          return new MessageSourceProperties();
      }
      
      @Bean(name = AbstractApplicationContext.MESSAGE_SOURCE_BEAN_NAME)
      public ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource( MessageSourceProperties properties ) {
          ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
          if (StringUtils.hasText( properties.getBasename() )) {
              messageSource.setBasenames( StringUtils.commaDelimitedListToStringArray( StringUtils.trimAllWhitespace( properties.getBasename() ) ) );
          }
          if (properties.getEncoding() != null) {
              messageSource.setDefaultEncoding( properties.getEncoding().name() );
          }
          messageSource.setFallbackToSystemLocale( properties.isFallbackToSystemLocale() );
          Duration cacheDuration = properties.getCacheDuration();
          if (cacheDuration != null) {
              messageSource.setCacheMillis( cacheDuration.toMillis() );
          }
          messageSource.setAlwaysUseMessageFormat( properties.isAlwaysUseMessageFormat() );
          messageSource.setUseCodeAsDefaultMessage( properties.isUseCodeAsDefaultMessage() );
          return messageSource;
      }
      

      解释

      spring.messages.basename=file:src/main/resources/messages => 直接从源读取文件 spring.messages.cache-duration=0 => 禁用缓存以重新加载文件。默认为 -1,表示永远缓存。

      ReloadableResourceBundleMessageSource bean 是 spring 的 MessageSourceAutoConfiguration.java impl 的直接副本,但使用 ReloadableResourceBundleMessageSource 作为消息源。

      Bean 需要具有名称 AbstractApplicationContext.MESSAGE_SOURCE_BEAN_NAME 才能禁用默认自动配置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-09
        • 2012-10-08
        • 2013-12-08
        • 2012-04-27
        • 1970-01-01
        • 2012-08-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多