2017-01-23 33 views
0

私は、コントローラを介して、以下を渡しています:反復処理のHashMap

HashMap<SomeClassA, ArrayList<SomeClassB>> 

SomeClassAとSomeClassBはプリミティブではない、と私で符号化されています。彼らのゲッターはStringsかLongsのいずれかです。 HashMap変数a map123を呼び出します。私がやろうとしています何

は、このコードのようなもの持っている:

<#list map123?keys as key> 
    ${key} = ${map123[key]} 
</#list> 

をしかし、私が取得することはmap123 [キー]がNULLであるということです! これは、私がArrayListを反復できないことを意味します。

私は何が間違っていましたか(あるいは何をすべきでしょうか)?

答えて

1

これはFreeMarker 2で最も問題のあるレガシーですが、回避策があります。 []演算子は、非文字列キーをサポートしていません。それはエラーですが、もう一つの遺産との不運な協力のおかげで、通常、オブジェクトのtoString()で検索が黙って行われるため、アイテムが見つからないだけです。

回避策:あなたはそれ以外の場合は、キーで値を取得する必要がある場合は、あなたが落ちることができ

<#list map123 as key, value> 
    ${key} = ${value} 
</#list> 

:あなただけただ、少なくともバージョン2.3.25-incubating(つまり、安定した最終リリースだ)と書き込みを使用し、反復処理する必要がある場合MapのJava API:map123?api.get(key)に戻ってください。 (?apiが明示的にFreeMarkerの設定で有効にする必要があることに注意してくださいが、エラーメッセージはそれを教えてくれます。)

+0

FreeMarkerのバージョンでnull値を確認することができますフレームワークに統合されているので、フレームワークが更新されない限り、バージョンを変更することはできません。ですから、私が使用しなければならない回避策は、必要な値だけをSomeClassAとSomeClassBから1つのSomeClassCに結合し、それをListとして渡すことで即興化することです。 –

+0

より高いバージョンでそのバージョンを上書きすることができない場合(フレームワークは単にMaven依存性ではないため)、最もクリーンな解決策は、 '?new'を介して公開することです(いくつかのユーティリティ' TemplateMethodModelEx'実装'WrapperTemplateModel.getWrappedObject()'を介して引数からJavaの 'Map'を取り出し、目的の結果リストを構築します。だから、 '<#list mapEntries(map123)as kvp> $ {kvp.key} = $ {kvp.value}'のようなものを使うことができます。 – ddekany

+0

FreeMarker 2.3.22では '?api'が導入されましたが、これはまったく新しいものではありません。あなたは '?api'を少なくとも持っているなら、' #list map123?api.entrySet()をkvp> $ {kvp.key} = $ {kvp.value} 'とすることができます。 – ddekany

1

をあなたは(2.3​​.25以降)のキーと値のペアを使用できない場合

<#list map123 as key, value> 
    ${key} = ${value} 
</#list> 

することができます

<#list map123.entrySet() as entry > 
    ${entry.key} = ${entry.value} 
</#list> 

を試してみてください、あなたは簡単に?existsディレクティブまたは私たちだだけ${entry.value!"default"}