2016-01-11 4 views
1

После выполнения некоторых тестов он выглядит ReloadableResourceBundleMessageSource не поддерживает подстановочные знаки.ReloadableResourceBundleMessageSource с помощью подстановочного знака

Давайте предположим, что расслоение файлы расположены в ресурсах и имеют следующие названия: messages.properties, messages_fr.properties и т.д.

Это базовое имя работ:

setBasename("classpath:/messages"); 

Это один не

setBasename("classpath*:/messages*"); 

Итак, что я могу сделать, чтобы загрузить все файлы свойств, соответствующие данному шаблону?

Примечание: Мне нужно использовать эту реализацию ReloadableResourceBundleMessageSource, так как я хотел бы разоблачить все свойства данной локали на уровне REST ... для использования с помощью углового перевода на стороне клиента, как описано here.

Некоторые идеи? Большое спасибо.

+0

Почему? Правильные «messages.properties» загружаются на основе локали текущего пользователя. Итак, что вы пытаетесь сделать уже автоматически ... –

+0

Подстановочный знак должен использоваться, поскольку мое приложение является модульным, и в этих модулях определены несколько сообщений. На данный момент учитывается только один. Похоже, что последний загружается. Текущая реализация предполагает, что все свойства определены в одном файле. –

+0

Вот как работает «ResourceBundle». –

ответ

1

Как объяснено на этом post, метод refreshProperties из ReloadableResourceBundleMessageSource может быть переопределен, чтобы обеспечить загрузку нескольких ресурсов из пути к классам и соответствующий заданному шаблону

Давайте рассмотрим конкретный пример, используя большую часть Spring boot defaults:

public class BaseReloadableResourceBundleMessageSource extends ReloadableResourceBundleMessageSource 
    implements InitializingBean { 

private static final String PROPERTIES_SUFFIX = ".properties"; 

private final PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); 

private final Charset encoding = Charset.forName("UTF-8"); 

@Autowired 
private Environment environment; 

/** 
* Returns the resource bundle corresponding to the given locale. 
*/ 
public Properties getResourceBundle(Locale locale) { 
    clearCacheIncludingAncestors(); 
    return getMergedProperties(locale).getProperties(); 
} 

@Override 
public void afterPropertiesSet() { 
    setBasename("classpath*:/" + environment.getProperty("spring.messages.basename", "messages")); 
    setDefaultEncoding(environment.getProperty("spring.messages.encoding", encoding.name())); 
    setCacheSeconds(environment.getProperty("spring.messages.cache-seconds", int.class, -1)); 
    setFallbackToSystemLocale(environment.getProperty("spring.messages.fallback-to-system-locale", 
      boolean.class, true)); 
} 

@Override 
protected PropertiesHolder refreshProperties(String filename, PropertiesHolder propHolder) { 
    final Properties properties = new Properties(); 
    long lastModified = -1; 
    try { 
     for (Resource resource : resolver.getResources(filename + PROPERTIES_SUFFIX)) { 
      final PropertiesHolder holder = super.refreshProperties(cleanPath(resource), propHolder); 
      properties.putAll(holder.getProperties()); 
      if (lastModified < resource.lastModified()) 
       lastModified = resource.lastModified(); 
     } 
    } catch (IOException ignored) { 
     // nothing to do 
    } 
    return new PropertiesHolder(properties, lastModified); 
} 

private String cleanPath(Resource resource) throws IOException { 
    return resource.getURI().toString().replace(PROPERTIES_SUFFIX, ""); 
} 

Смежные вопросы