当通过 EL 从 bean 获取currencySymbol 时,f:convertNumber 失败

arp*_*pho 1 jsf number-formatting

您好,在我的项目中,我需要可视化货币价值,就我的 f:convertNumber 而言

我使用固定的货币符号;一切都很好,但是当我尝试使用如下表达语言获取符号时:

<h:outputText value="#{rowItem.value}">
    <f:convertNumber currencySymbol="#{rowItem.getCurrencySymbol()}" groupingUsed="true" maxFractionDigits="2" type="currency" />
</h:outputText>
Run Code Online (Sandbox Code Playgroud)

就像没有调用 getCurrencySymbol 方法一样,我确信我缺少一些东西。

Bal*_*usC 6

#{rowItem}如果仅在视图渲染期间可用,例如当它由 指定时(<h:dataTable var="rowItem">如变量名称本身所暗示的那样),则会发生这种情况。#{rowItem}如果在构建视图和渲染视图之间发生更改,例如当它来自同一表单的下拉组件时,也可能会发生这种情况。它<f:convertNumber>是一个标签处理程序,而不是一个 UI 组件。它在视图构建时执行,而不是在视图渲染时执行。在视图构建期间,所需的#{rowItem}值并非根据定义可用。

这一切都在JSF2 Facelets 的 JSTL 中进行了解释...有意义吗?在该答案中,您可以替换“JSTL”,<f:convertNumber>因为它们都是标记处理程序,因此具有完全相同的生命周期。

如果不创建自定义转换器并更改视图或模型,标准 JSF API 中就没有解决方案。您可以在此答案中找到可能的解决方案:How to set converter properties for every row/item of h:dataTable/ui:repeat?

JSF 实用程序库OmniFaces提供了<o:converter>现成的解决方案来解决这个问题。使用方法如下:

<h:outputText value="#{rowItem.value}">
    <o:converter converterId="javax.faces.Number" currencySymbol="#{rowItem.getCurrencySymbol()}" type="currency" />
</h:outputText>
Run Code Online (Sandbox Code Playgroud)

(请注意,我省略了其他两个属性,因为它们在type="currency"使用时已经是默认值)