2017-10-09 10 views
0

Freemarkerでは、私はモデルにMap<Map<...>>を持っています。Freemarker:?api可能なタイプをチェックする方法(v 2.3.26)

FMグリッチのため、第2レベルのクエリMapには?apiが必要です。しかし、それは通常の価値の存在チェックを免れ、事を複雑にします。

これは私が持っているものです:私は

sortedStatsMap[rowTag.name]!?is_hash 

をしようとすると不足している場合、それは私を与えるので、これはまた、失敗した

APINotSupportedTemplateException: The value doesn't support ?api. See requirements in the FreeMarker Manual. 
(FTL type: sequence+extended_hash+string (wrapper: f.c.DefaultToExpression$EmptyStringAndSequence), 
TemplateModel class: f.c.DefaultToExpression$EmptyStringAndSequence, 
ObjectWapper: [email protected](2.3.26, useAdaptersForContainers=true, forceLegacyNonListCollections=true, iterableSupport=trueexposureLevel=1, exposeFields=false, treatDefaultMethodsAsBeanMembers=true, [email protected], ...)) 
The blamed expression: 
==> sortedStatsMap[rowTag.name]! [in template "reports/templates/techReport-boxes.ftl" at line 152, column 84] 

<#if sortedStatsMap[rowTag.name]?? && sortedStatsMap[rowTag.name]?is_hash> 
    ${mapToJson(sortedStatsMap[rowTag.name]?api.get(boxTag.name))!} 
</#if> 

これはで終了報道によると、empty_string_and_sequence?is_hashは適用できません。 (エラーの場合)

?api.get(key)を使用できるかどうかを確認する適切なロジックは何ですか?または、欠損値や欠落したキーを処理するために!を使用する正しい方法はありますか?

+0

'?is_hash'は、' EmptyStringAndSequence'で動作する必要があります。しかし、私もそれを試して、それは私のために動作します。もう一度確認できますか? – ddekany

+0

'boxTag.name'は常に'ヌル ''文字列 'ではありませんか?それがあれば、どんなFMグリッチに遭遇しましたか?あなたは '?api'を使用するよう強制しますか? – ddekany

+0

'thisIsNull! 'の結果は'?api'をサポートしていないことは事実です。しかし、あなたのコードがどのように動くのかは分かりません。どこで '?api'を使うのか、'! 'は使わないのですか?この例は正確ですか? ( '?is_hash'はなぜ関係ないのですか?'?apiのサポートはハッシュとは関係ありません。) – ddekany

答えて

0

?apiの値が?has_apiをサポートしているかどうかを確認できます。多分あなたはそれを必要としません。その例とそれに関連する問題を明確にすべきである(私のコメントを参照)。

関連する問題