如何在百里香的邮件属性文件中使用自定义位置?

时间:2015-04-20 12:34:52

标签: spring thymeleaf

我使用thymeleaf和spring,我的messages.properties文件需要与模板具有相同的名称才能使它们正常工作。我尝试使用webConfigurer.Java创建自定义路径,但它无法正常工作。

WebConfigurer.java来源:

...
...
@EnableWebMvc
@EnableTransactionManagement
@Configuration
@ComponentScan({"en.irp.project.*"})
@PropertySource("classpath:/application.properties")
@Import({SecurityConfigurer.class})
public class WebConfigurer extends WebMvcConfigurerAdapter {
    ...
    ...
    ...
    @Bean(name="messageSource")
    public ReloadableResourceBundleMessageSource messageSource() {
        ReloadableResourceBundleMessageSource resource = new ReloadableResourceBundleMessageSource();
        resource.setBasename("WEB-INF/languages/messages");
        resource.setDefaultEncoding("UTF-8");
        return resource;
    }

    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
        localeChangeInterceptor.setParamName("language");
        return localeChangeInterceptor;
    }

    @Bean(name = "localeResolver")
    public SessionLocaleResolver localeResolver() {
        SessionLocaleResolver localeResolver = new SessionLocaleResolver();
        localeResolver.setDefaultLocale(new Locale("en"));
        return localeResolver;
    }
    ...
    ...
}

4 个答案:

答案 0 :(得分:4)

仅供将来参考。

如果使用 Spring Boot ,您还可以在 application.properties 文件中设置其自定义位置:

spring.messages.basename=i18n/messages

的Javadoc:

  

以逗号分隔的基本名称列表,每个基本名称都在ResourceBundle之后   惯例。基本上是一个完全限定的类路径位置。如果它   它不包含包限定符(例如“org.mypackage”)   从类路径根解析。

答案 1 :(得分:3)

messages.properties文件需要与模板具有相同名称的想法并不常见。但是,您可以通过侦听配置中的所有文件来解决此问题。           messageSource.setBasenames("classpath:i18n/template1","classpath:i18n/template2"...);

如果您将它们放入类路径或由classpath:i18n替换WEB-INF/languages。 也许您可以通过程序逻辑创建基本名称列表。 请记住,即使采用这种方法,消息密钥也只能在您的应用程序中定义一次。

答案 2 :(得分:1)

我遇到了同样的问题,我按照以下方式开展工作。

@Bean
public MessageSource messageSource()
{       
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasenames( "file:" + System.getProperty( "web.server.message" ), "/WEB-INF/languages/messages" );
    messageSource.setDefaultEncoding( CHARACTER_ENCODING );
    return messageSource;
}

这里我想在DEV模式下使用不同的消息文件集,所以我在pom.xml中使用了一个系统属性来获取消息文件路径。我的消息文件采用以下格式:languages文件夹下的messages_en.properties。

<systemProperties>                    
     <web.server.message>${basedir}/src/main/resources/conf/languages/messages</web.server.message>
</systemProperties>

答案 3 :(得分:0)

在application.properties文件中,只需提及spring.messages.baseDir的值。

@Bean
public ReloadableResourceBundleMessageSource messageSource() {
    ReloadableResourceBundleMessageSource resource = new ReloadableResourceBundleMessageSource();
    List<String> baseNames = new ArrayList<>();
    String baseName = applicationProperties.getString("spring.messages.basename", DEFAULT_MESSAGE_BASENAME);
    String messageResourcePath = applicationProperties.getString("spring.messages.baseDir");
    if(isNotEmpty(messageResourcePath)){
        baseNames.add(String.format("file:%s", Paths.get(messageResourcePath, baseName)));
    }
    baseNames.add(String.format("classpath:%s", baseName));
    resource.setBasenames(baseNames.toArray(new String[baseNames.size()]));
    String encoding = applicationProperties.getString("spring.messages.encoding", CHARACTER_ENCODING);
    LOGGER.debug("Encoding is set to :: {}", encoding);
    resource.setDefaultEncoding(encoding);
    resource.setUseCodeAsDefaultMessage(true);
    return resource;
}