我有调度程序。每隔5秒钟,我就会从数据库中获取一些项目,并向Android发送推送通知。但是在此通知中以俄语显示文本。在功能上,我们支持不同的语言,现在我尝试创建一些模板。我有用于消息模板的属性文件:messages_ru_RU.properties
,并且在此文件中有字符串:notification.message=%s. На сумму: %s. Карта: %s
我需要从属性加载此String并将%s
重新分配为我的值。现在,我创建配置服务:
@Configuration
public class LocaleConfig {
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver();
Locale defaultLocale = new Locale("ru");
slr.setDefaultLocale(defaultLocale);
return slr;
}
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setCacheSeconds(3600); //refresh cache once per hour
return messageSource;
}
}
和服务:
@Component
public class MessageByLocaleServiceDefault implements MessageByLocaleService {
private final MessageSource messageSource;
@Autowired
public MessageByLocaleServiceDefault(MessageSource messageSource) {
this.messageSource = messageSource;
}
@Override
public String getMessage(String id) {
Locale locale = LocaleContextHolder.getLocale();
return messageSource.getMessage(id, null, locale);
}
}
我尝试从这样的属性加载字符串:
String messagePlaceholder = messageByLocaleService.getMessage("notification.message");
但是我看到了:
我的问题-如何在春季启动时从message.properties加载俄语(西里尔字母,utf-8)文本?
我的属性文件以utf-8编码保存。
最佳答案
确保还通过配置MessageSource
属性正确设置setDefaultEncoding()
编码:
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setCacheSeconds(3600);
messageSource.setDefaultEncoding("UTF-8"); // Add this
return messageSource;
}
根据API文档,默认值为ISO-8859-1:
默认值为无,使用
java.util.Properties
默认编码:ISO-8859-1。另外,请注意
SessionLocaleResolver
仅适用于用户会话。如果要将MessageSource
与预定任务结合使用,则它将无法正常工作。