我想创建一个自定义的JSF组件,它以指定的格式显示数值,并且工具提示显示相同的值。
但是,当我实际尝试使用我的组件时,我会收到由value属性转换失败引起的异常:
javax.faces.convert.ConverterException:form1:myAccordion:myComponentText:无法转换' 345'到一个字符串。
我的页面如下:
<my:outputNumber id="myComponent"
value="#{bean.value}" tooltip="true" />
其中
bean.getValue()属于BigDecimal类型,组件定义如下:
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jstl/core"
xmlns:p="http://primefaces.org/ui"
xmlns:pe="http://primefaces.org/ui/extensions"
xmlns:composite="http://java.sun.com/jsf/composite">
<ui:composition>
<c:if test="{empty type}">
<c:set var="type" value="number"/>
</c:if>
<c:if test="{empty decimals}">
<c:set var="decimals" value="2"/>
</c:if>
<c:if test="{empty tooltip}">
<c:set var="tooltip" value="false"/>
</c:if>
<c:when test="#{tooltip == 'byValue'}">
<c:set var="renderTooltip" value="#{empty value}" />
</c:when>
<c:otherwise>
<c:set var="renderTooltop" value="#{tooltip}" />
</c:otherwise>
<p:outputPanel id="#{id}" styleClass="my-output-number #{styleClass}">
<h:outputText id="#{id}Text" value="#{empty value? '-' : value}" styleClass="my-output-number-value">
<f:convertNumber type="#{type}" locale="IT_it"
minFractionDigits="#{decimals}" maxFractionDigits="#{decimals}" />
</h:outputText>
<c:if test="#{tooltip}">
<pe:tooltip for="#{id}Tooltip" value="#{empty value? '-' : value}"
rendered="#{renderTooltip}" styleClass="my-output-number-tooltip">
<f:convertNumber type="#{type}" locale="IT_it"
minFractionDigits="#{decimals}" maxFractionDigits="#{decimals}" />
</pe:tooltip>
</c:if>
</p:outputPanel>
</ui:composition>
最后,我的taglib文件包含以下声明:
<tag>
<tag-name>outputNumber</tag-name>
<source>../layouts/component/outputNumber.xhtml</source>
<attribute>
<name>id</name>
<required>true</required>
</attribute>
<attribute>
<name>value</name>
<required>true</required>
</attribute>
<attribute>
<name>type</name>
</attribute>
<attribute>
<name>decimals</name>
<type>int</type>
</attribute>
<attribute>
<name>tooltip</name>
</attribute>
<attribute>
<name>styleClass</name>
</attribute>
</tag>
如果我使用
value="#{text[value]}"强制将返回的值转换为文本,我不会导致任何异常,但我会得到一个空字符串。
我知道这是可行的,因为如果我只是在我的页面中放置一个带有convertNumber和tooltip的outputText而不需要使用自定义组件,它就能完美运行。
如何解决此问题?