修复国际化资源加载,basename 含通配符时抛出 Illegal char <*> 异常的问题 && 默认扫描 classpath*,不许在 basename 中额外定义了

This commit is contained in:
b2baccline
2021-08-20 20:20:23 +08:00
parent fdeadc8c28
commit 9b7709ee46
2 changed files with 33 additions and 15 deletions

View File

@@ -26,24 +26,48 @@ public class WildcardReloadableResourceBundleMessageSource extends ReloadableRes
private final PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
/**
* Calculate all filenames for the given bundle basename and Locale. Will calculate
* filenames for the given Locale, the system Locale (if applicable), and the default
* file.
* @param basename the basename of the bundle
* @param locale the locale
* @return the List of filenames to check
* @see #setFallbackToSystemLocale
* @see #calculateFilenamesForLocale
*/
@Override
protected List<String> calculateAllFilenames(String basename, Locale locale) {
// 父类默认的方法会将 basename 也放入 filenames 列表
List<String> filenames = super.calculateAllFilenames(basename, locale);
// 当 basename 有匹配符时,从 filenames 中移除,否则扫描文件将抛出 Illegal char <*> 的异常
if (basename.contains("*")) {
filenames.remove(basename);
}
return filenames;
}
@Override
protected List<String> calculateFilenamesForLocale(String basename, Locale locale) {
// 支持 basename 用 . 表示文件层级
basename = basename.replace(".", "/");
List<String> filenames = super.calculateFilenamesForLocale(basename, locale);
List<String> add = new ArrayList<>();
for (String filename : filenames) {
// 资源文件名
List<String> fileNames = new ArrayList<>();
// 获取到待匹配的国际化信息文件名集合
List<String> matchFilenames = super.calculateFilenamesForLocale(basename, locale);
for (String matchFilename : matchFilenames) {
try {
Resource[] resources = resolver.getResources(filename + PROPERTIES_SUFFIX);
Resource[] resources = resolver.getResources("classpath*:" + matchFilename + PROPERTIES_SUFFIX);
for (Resource resource : resources) {
String sourcePath = resource.getURI().toString().replace(PROPERTIES_SUFFIX, "");
add.add(sourcePath);
fileNames.add(sourcePath);
}
}
catch (IOException ignored) {
}
}
filenames.addAll(add);
return filenames;
return fileNames;
}
}

View File

@@ -103,14 +103,8 @@ public class CustomMessageSourceAutoConfiguration {
private Resource[] getResources(ClassLoader classLoader, String name) {
String target = name.replace('.', '/');
try {
String locationPattern;
if (target.startsWith("classpath")) {
locationPattern = target + ".properties";
}
else {
locationPattern = "classpath*:" + target + ".properties";
}
return new PathMatchingResourcePatternResolver(classLoader).getResources(locationPattern);
return new PathMatchingResourcePatternResolver(classLoader)
.getResources("classpath*:" + target + ".properties");
}
catch (Exception ex) {
return NO_RESOURCES;