Freemarker - 如何间接识别缺失列表

Freemarker - How to indirectly recognize a missing list

在 Freemarker 中,如何间接识别缺失的列表变量?间接地,我的意思是我有一个包含列表名称的字符串值;我需要将该字符串转换为(列表的)变量名,然后检查列表是否存在。这种间接访问对我的应用程序至关重要。

例如,这段代码有效:

<#assign existing_list      = ["a","b"]>
<#assign existing_list_name = "existing_list">
<#assign ref_existing_list  = existing_list_name?eval>

<#if ref_existing_list?has_content>
    Correctly identified existing list.
<#else>
    Failed to identify existing list.
</#if>

生成输出:

 Correctly identified existing list.

但是如果列表不存在,那么我无法将字符串转换为变量名来检查列表是否存在。例如:

<#assign nonexistent_list_name = "nonexistent_list">
<#assign ref_nonexistent_list  = nonexistent_list_name?eval>

<#if ref_nonexistent_list?has_content>
    Failed to identify that list was non-existent.
<#else>
    Correctly identified that list was non-existent.
</#if>

终止 Freemarker 并出现以下错误:

<FreeMarker>[Error] freemarker.core.InvalidReferenceException: The following  has evaluated to null or missing:
==> nonexistent_list_name?eval  [in template "utilities\mhc\templates\app\app.h.ftl" at line 17, column 34]

我似乎需要能够将字符串转换为变量名,即使变量丢失,或者在不中止的情况下对空变量引用执行 eval。但我一直无法找到这些 Freemarker 功能中的任何一个。

谁能提出解决方案?

这里要认识到的关键是不能将缺失的东西分配给变量。但是你可以这样做:

<#assign nonexistent_list_name = "nonexistent_list">

<#if .vars[nonexistent_list_name]?has_content>
  The list exists AND is not empty
<#else>
  The list doesn't exists OR it's empty
</#if>

<#-- The above is nicer, but this still works: -->
<#if nonexistent_list_name?eval?has_content>
  The list exists AND is not empty
<#else>
  The list doesn't exists OR it's empty
</#if>

另一件值得知道的事情是 ?has_content 为现有但空的列表提供 false。如果您只想检查列表是否存在,请改用 ??(如 <#if .vars[nonexistent_list_name]??>)。但如果你确实想以同样的方式处理空列表和缺失列表,那么毕竟你也可以做赋值:

<#assign nonexistent_list_name = "nonexistent_list">
<#assign nonexistent_listref = .vars[nonexistent_list_name]!>

<#if nonexistent_listref?has_content>
  The list exists AND is not empty
<#else>
  The list doesn't exists OR it's empty
</#if>

(注意#list可以有一个#else空列表的分支,当你想做一个列表时,它可以节省一些字符。)