2011-12-28 11 views
0

HashMapのエントリを空にするサポートされているルートを定義するJSON設定ファイルの表現です。例:反復処理は、以下の方法が「ルート」(クラス名、クラスメソッド)を取得

{ 
    "^/?(?<interface>threads)/?$": { 
     "GET": "list", 
     "POST": "create" 
    }, 
    "^/?(?<interface>threads)/(?<id>\\d+)/?$": { 
     "GET": "get", 
     "POST": "reply", 
     "PUT": "edit", 
     "PATCH": "edit", 
     "DELETE": "delete" 
    } 
} 

EDIT

try { 
     JsonParser parser = JSONFactory.createJsonParser(in); 
     JsonNode root = JSONMapper.readTree(parser); 
     Iterator base = root.getFieldNames(); 
     Iterator node; 
     String match, method; 
     HashMap<Pattern, HashMap<String, String>> routesMap = new HashMap(); 

     while (base.hasNext()) { 
      match = base.next().toString(); 

      if (match != null) { 
       node = root.get(match).getFieldNames(); 
       HashMap<String, String> methods = new HashMap(); 

       while (node.hasNext()) { 
        method = node.next().toString(); 

        if (method != null) { 
         methods.put(method, root.get(match).get(method).getTextValue()); 
        } 
       } 

       if (!methods.isEmpty()) { 
        routesMap.put(Pattern.compile(match), methods); 
       } 
      } 
     } 

     if (!routesMap.isEmpty()) { 
      hasRoutes = true; 
      routes = routesMap.entrySet(); 
     } 

     // Help garbage collection 
     parser = null; 
     root = null; 
     base = null; 
     node = null; 
     match = null; 
     method = null; 
     routesMap = null; 
    } catch (Exception ex) { 
    } 

EDIT 2、質問&のinit()メソッド内のプロパティ:JSONファイルの内容からサーブレットにアクセスするいくつかの理由

public final static JsonFactory JSONFactory = new JsonFactory(); 
public final static ObjectMapper JSONMapper = new ObjectMapper(); 
public static Router router; 
private final Class self = getClass(); 
private final ClassLoader loader = self.getClassLoader(); 

public void init(ServletConfig config) throws ServletException { 
    super.init(config); 

    router = new Router(self.getResourceAsStream("/v1_0/Routes.json"), JSONFactory, JSONMapper); 
} 

最初の時間が経過した後のHashMapは空です値。 x.size()はゼロを返します。

これはPHPアプリケーションを初心者から書き直したものですので、問題が何か平凡なものであれば事前にお詫び申し上げます。

完全なソース: - Router source - Route source

+1

どのように設定/キャッシュされていますか?コード内の何も何も削除しません。 –

+0

@Dave Newton、JSONファイルの表現をHashSetに「キャッシュ」する手順を追加しました。 –

+0

私がここで見つけることができなかったことは、どこにどのようにキャッシュしているかです。それはサーブレットのinit()フェーズにキャッシュされ、後続のフェーズで使用されますか? – kosa

答えて

0

getOptions()メソッドは、繰り返し実行されるたびにすべてのエントリをこのマップから削除します。したがって、getOptions()を一度呼び出した後、地図は空です。

ところで、変数にnullを割り当てると、でなく、「ガベージコレクタを助けてください。ガベージコレクタは、変数のスコープが終了すると、その変数がオブジェクトを参照しなくなることを認識します。あなたは実際に読むことができない値(null)を割り当てることで、実際には速度を落としています(逆効果ノイズであなたのコードを混乱させるだけです)。 FindBugsのような良い静的解析ツールは、これが悪いコードであることを警告します。

+0

あなたは英雄バディ、素人バグですが、私はそれを押しつぶすことができます。ガベージコレクションのヒントもありがとう。 –

0

HashSetのを反復は、HashMapのエントリ

起こらない

を空にします。単にHashSetを反復するだけでは、セットの内容に副作用はありません。

問題の原因となっている問題がここにあります。

+0

こんにちはスティーブン、ルータとルートクラスのコード全体: [リンク](http://martingallagher.com/code/Router.java) [リンク](http://martingallagher.com/code /Route.java) –

関連する問題