我有调度程序。每隔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");


但是我看到了:

java - 如何在 Spring 启动时从message_ru_RU.properties加载俄语(西里尔字母,utf-8)文本?-LMLPHP

我的问题-如何在春季启动时从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与预定任务结合使用,则它将无法正常工作。

09-16 06:47