Spring批量使用国际化资源的改进

最近研究spinrg(mvc)+openjpa,相比Struts2来说SpringMVC最郁闷的是国际化资源文件的配置,不知道是我不会还是什么原因,必须要一个一个写。看了源代码貌似也没有提供批量导入的方法,所以尝试着进行了一些修改。因为没有仔细研究Spring的代码,只简单改了一下,效率等方面可能考虑的不多,但我主要用在WEB部分,只在启动的时候加载,效率也不会有太大的影响。少说 上代码

 

xml配置

  <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="/WEB-INF/classes/com/strong/messages/messages" />
    <property name="cacheSeconds" value="0" />
  </bean>

 

可以看出要修改的就是“org.springframework.context.support.ReloadableResourceBundleMessageSource”,我重建了一个class:com.strong.utils.spring.ReloadableResourceBundleMessageSource,修改部分代码:

  public void setBasenames(String[] basenames) {
    if (basenames != null && basenames.length > 0) {
      String strWebPath = this.getClass().getClassLoader().getResource("../../").getPath();
      String strBasePath = strWebPath + basenames[0];
      try {
        List<File> listFile = FileUtils.getSuoYouWenJianLuJing(strBasePath);
        List<String> listFile1 = new ArrayList<String>();
        for (File file : listFile) {
          if (!file.isDirectory() && file.getName().indexOf("_") == -1 && file.getName().indexOf(".properties") > -1) {
            listFile1.add(file.getAbsolutePath().replace(strWebPath, "").replace(".properties", ""));
          }
        }
        this.basenames = new String[listFile1.size()];
        for (int i = 0; i < listFile1.size(); i++) {
          this.basenames[i] = listFile1.get(i).trim();
          System.out.println("load properties file: " + listFile1.get(i).trim());
        }
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }

      // this.basenames = new String[basenames.length];
      // for (int i = 0; i < basenames.length; i++) {
      // String basename = basenames[i];
      // Assert.hasText(basename, "Basename must not be empty");
      // this.basenames[i] = basename.trim();
      // System.out.println(basename);
      // }
    } else {
      this.basenames = new String[0];
    }
  }

 为了尽可能的减少耦合的部分,只是在这里把从list中获取资源文件数组改为只获取第一个,并遍历这个目录将其中的所有properties扩展名且不含_的文件的相对路径增加到basenames中,其他的都不改变。遍历文件目录的代码:

  public static List<File> getSuoYouWenJianLuJing(String strLuJing) throws IOException {
    if (strLuJing == null || strLuJing.length() == 0) {
      return null;
    }
    File fileLuJing = new File(strLuJing);
    if (!fileLuJing.exists()) {
      return null;
    }
    return getSuoYouWenJianLuJing(fileLuJing);
  }

 重新修改XML文件如下:

  <bean id="messageSource" class="com.strong.utils.spring.ReloadableResourceBundleMessageSource">
    <property name="basenames" value="WEB-INF/classes/com/strong" />
    <property name="cacheSeconds" value="0" />
  </bean>

 OK 完工,代码写的非常粗糙,并且也只修改了ReloadableResourceBundleMessageSource类,不过大概意思和思路已经差不多了,至于使用通配符获取资源文件例如 /WEB-INF/classes/com/strong/*/messages等就类似了

 

你可能感兴趣的:(spring,bean,Web,mvc,xml)