Spring - 验证所有消息资源配置良好

时间:2018-02-16 09:44:15

标签: java spring jsp

我们需要添加一些要在应用程序加载时执行的代码,以验证所有messages.properties元素都是为所有语言定义的。 这可能吗?

步骤:动态读取应用程序加载来自JSP或java类的所有Spring消息代码,然后传递所有消息资源属性文件,并验证它们没有遗漏任何内容。

1 个答案:

答案 0 :(得分:0)

我们最终手动完成此操作,但没有使用任何库。 的步骤:

  • 将Java类或JSP中使用的所有键都定义在常量文件中
  • 使用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);
        }
     }
    } 
    

注意:或者另一种解决方法是将所有消息资源文件与默认文件进行比较,这样我们就可以最小化上述解释所需的代码。