如何在 spring boot 中从 message_ru_RU.properties 加载俄语(西里尔文,utf-8)文本?

ip6*_*696 2 java localization properties spring-boot

我有调度程序。每 5 秒我从数据库获取一些项目并将推送通知发送到 android。但是此通知中的文本为俄语。在功能上,我们支持不同的语言,现在我尝试创建一些模板。我有消息模板的属性文件:messages_ru_RU.properties我在这个文件中有字符串: notification.message=%s. ?? ?????: %s. ?????: %s

我需要从属性加载这个字符串并重新修改%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;
  }
}
Run Code Online (Sandbox Code Playgroud)

和服务:

@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);
  }
}
Run Code Online (Sandbox Code Playgroud)

我尝试从这样的属性加载字符串:

String messagePlaceholder = messageByLocaleService.getMessage("notification.message");
Run Code Online (Sandbox Code Playgroud)

但我看到这个:

在此处输入图片说明

我的问题 - 如何在 spring boot 中从 message.properties 加载俄语(西里尔文,utf-8)文本?

我的属性文件以 utf-8 编码保存。

g00*_*00b 5

确保还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;
}
Run Code Online (Sandbox Code Playgroud)

根据 API 文档,默认值为 ISO-8859-1:

默认为无,使用java.util.Properties默认编码:ISO-8859-1。


另外,请注意,SessionLocaleResolver仅适用于用户会话。如果您打算将MessageSource与计划任务结合使用,它将无法正常工作。