我们需要添加一些要在应用程序加载时执行的代码,以验证所有messages.properties元素都是为所有语言定义的。 这可能吗?
步骤:动态读取应用程序加载来自JSP或java类的所有Spring消息代码,然后传递所有消息资源属性文件,并验证它们没有遗漏任何内容。
答案 0 :(得分:0)
我们最终手动完成此操作,但没有使用任何库。 的步骤:强>
使用Java .class属性读取它们:
Field[] fields = Constants.class.getFields();
String filed[i].get(Constants.class);
使用以下命令从项目中读取所有messageResources.properties文件名:
String pathToThisClass = MessageResourcesValidator.class.getProtectionDomain().getCodeSource().getLocatin().getPath();
File filePath = new File(pathToThisClass);
String[] list = filePath.list(new DirFilter("(messages).*\\.(properties)"));
DirFilter是一个实现Java的FileNameFilter的普通类
创建一个使用文件名从文件中读取属性的类:
public class PropertiesFile{
private Properties prop;
public PropertiesFile(String fileName) throws Exception
{
init(fileName);
}
private void init(String fileName) throws Exception
{
prop = new Properties();
try (InputStream input = getClass().getClassLoader().getResourceAsStream(fileName);)
{
if(input == null)
{
throw new Exception("Enable to load properties file " + fileName);
}
prop.load(input);
}
catch(IOException e)
{
throw new Exception("Error loading properties file " + fileName);
}
}
public List<String> getPropertiesKeysList()
{
List<String> result = new ArrayList<>();
Enumeration<?> e = prop.propertyNames();
while(e.hasMoreElements())
{
result.add((String) e.nextElement());
// String value = prop.getProperty(key);
}
return result;
}
}
进行比较的部分应该是以下调用上述方法的代码:
List<String> msgResourcesFiles = getMessageResourcesFileNames();
List<String> codeKeys = getListOfCodeMessageResources();
PropertiesFile file = null;
List<String> propKeys = null;
for(String fileName : msgResourcesFiles)
{
file = new PropertiesFile(fileName);
propKeys = file.getPropertiesKeysList();
for(String key : codeKeys)
{
if(!propKeys.contains(key))
{
throw new Exception("Missing key " + key);
}
}
}
注意:或者另一种解决方法是将所有消息资源文件与默认文件进行比较,这样我们就可以最小化上述解释所需的代码。