天天看點

Tiny Dict架構

使用了Tiny的Dict架構,現象如下,本地測試沒問題,放到伺服器上之後,報空指針,訓示沒有擷取到指定的字典。

遠端調試代碼,發現是DictManagerImpl在查找指定的字典時沒有找到對應的dictLoader,DictManagerImpl擷取字典的代碼如下:

public Dict getDict(String dictTypeName, Context context) {
        String lang = LocaleUtil.getContext().getLocale().toString();
        return getDict(lang, dictTypeName, context);
//      if(!dictLoaderMap.containsKey(lang)){
//          throw new RuntimeException("Locale:{}" + lang + "涓嶅瓨鍦ㄥ搴旂殑DictLoader");
//      }
//      for (DictLoader dictLoader : dictLoaderMap.get(lang)) {
//          Dict dict = dictLoader.getDict(dictTypeName, this, context);
//          if (dict != null) {
//              return dict;
//          }
//      }
//      throw new RuntimeException("娌℃湁鎵懼埌<" + dictTypeName + ">鐨勫瓧鍏哥被鍨�);
    }

    public Dict getDict(String lang, String dictTypeName, Context context) {
        if (!dictLoaderMap.containsKey(lang)) {
            throw new DictRuntimeException(DictExceptionErrorCode.DICT_LOADER_NOT_FOUND, lang);
//          throw new RuntimeException("Locale:{}" + lang + "涓嶅瓨鍦ㄥ搴旂殑DictLoader");
        }
        for (DictLoader dictLoader : dictLoaderMap.get(lang)) {
            Dict dict = dictLoader.getDict(dictTypeName, this, context);
            if (dict != null) {
                return dict;
            }
        }
        throw new DictRuntimeException(DictExceptionErrorCode.DICT_TYPE_NAME_NOT_FOUND, dictTypeName);
//      throw new RuntimeException("娌℃湁鎵懼埌<" + dictTypeName + ">鐨勫瓧鍏哥被鍨�);
    }      

經過與本地的調試的對比,發現擷取本地語言的代碼:

String lang = LocaleUtil.getContext().getLocale().toString();      

在本地運作時,擷取到的是zh_CN,而在伺服器運作時擷取到的是en_US。本地的作業系統是中文的,遠端伺服器是英文linux,于是将遠端伺服器的本地語言改成中文,問題解決了。

疑問:

DictManager管理DictLoader,其持有了一個Map<String, List> dictLoaderMap類型的域dictLoaderMap。

dictLoaderMap中的key在put和get時都是LocaleUtil.getContext().getLocale().toString()

為什麼在英文環境下會出現擷取不到DictLoader的現象?

<tiny-filter id="setLocaleTinyFilter" class="setLocaleTinyFilter">
      <filter-mapping url-pattern=".*" />
      <init-param name="defaultLocale" value="zh_CN" />
      <init-param name="defaultCharset" value="UTF-8" />
      <init-param name="inputCharset" value="_input_charset" />
      <init-param name="outputCharset" value="_output_charset" />
      <init-param name="paramKey" value="_lang" />
      <init-param name="sessionKey" value="_lang" />
    </tiny-filter>