2016-01-11 106 views
1

進行一些測試後,它看起來像ReloadableResourceBundleMessageSource不支持通配符使用通配符ReloadableResourceBundleMessageSource

我們假設包文件位於資源,並具有下列名稱:messages.properties,messages_fr.properties等

該基地名稱的工作原理:

setBasename("classpath:/messages"); 

這一個不

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

那麼,我能做些什麼來加載匹配給定模式的每個屬性文件?

備註:我需要使用ReloadableResourceBundleMessageSource這個實現,因爲我想在REST級別公開給定語言環境的每個屬性......以便可以在客戶端上使用角度翻譯,如解釋here所述。

有些想法?非常感謝。

+0

爲什麼?根據當前用戶的區域設置加載正確的'messages.properties'。所以你正在嘗試已經自動完成... –

+0

需要使用通配符,因爲我的應用程序是模塊化的,並且在這些模塊中定義了多個messages.properties。目前,只有一個被考慮在內。它看起來是最後一個被加載的。當前的實現假設我們已經在同一個文件中定義了所有的屬性。 –

+0

這就是'ResourceBundle'的工作方式。 –

回答

1

由於這個post解釋,ReloadableResourceBundleMessageSource的refreshProperties方法可以重寫,以允許從classpath中的多個資源的加載和對應於給定模式

讓我們使用的大部分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, ""); 
} 

}