在Freemarker模板中调用具有非标准类参数的方法

时间:2014-09-18 14:49:57

标签: java templates enums freemarker

有很多问题要求如何在根映射中的值集上调用非bean方法。当我传入的参数不是标准类型时(例如,当它定义了枚举(或任何其他类)时,我该怎么做?)

例如,我可以在我的Freemarker模板中轻松地执行以下操作:

<p>${product.name}</p>
<p>${product.normalizedDescription()}</p>

但是当我调用的方法在我的Java代码中定义了Currency enum时呢?

<p>${product.getPriceAsString(Currency.USD)}</p>

模板如何知道Currency enum以及在哪里找到它的定义?

1 个答案:

答案 0 :(得分:1)

天真的解决方案是将Currency.USD(Java枚举值本身)的值放入数据模型中,例如名称为"USD",然后您可以编写${product.getPriceAsString(USD)}

当然,将所有枚举值放入数据模型中可能会出现问题。因此,您可以将((BeansWrapper) cfg.getObjectWrapper()).getEnumModels().get(Currency.class.getName())放入名为"Currency"的数据模型中,然后${product.getPriceAsString(Currency.USD)}应该有效。

您可以再向前迈一步,将名为((BeansWrapper) cfg.getObjectWrapper()).getEnumModels()的{​​{1}}放入数据模型中,然后模板可以执行enums之类的操作,但这有点开始反MVC。

另请注意,您可以将这些值作为共享变量放入<#assign Currency = enums['com.example.Currency']>,而不是将它们放入数据模型中。