我已经为输出java.math.BigDecimal创建了自定义Converter。当BigDecimal为0.00或null我要输出破折号时。
null
这是我的XHTML
<p:dataTable value="#{bean.data}" var="item"> <p:column> <h:outputText value="#{item.currentValue}"> <f:converter converterId="my.bigDecimalConverter" /> </h:outputText> </p:column> </p:dataTable>
我遇到的问题是当#{item.currentValue}是转换器中null的getAsString方法未调用时。
getAsString
@FacesConverter("my.bigDecimalConverter") public class BigDecimalConverter implements Converter { @Override public String getAsString(FacesContext context, UIComponent component, Object value) { if (context == null || component == null) { throw new NullPointerException(); } if (value == null) { System.out.println("null="); return "--"; } System.out.print("Class=" + value.getClass()); if (value instanceof String) { System.out.println("Str=" + value); return (String) value; } if (value instanceof BigDecimal) { BigDecimal bd = (BigDecimal)value; if (bd.equals(new BigDecimal("0.00"))) { return "--"; } else { return bd.toPlainString(); } } return ""; } }
我说它没有被调用是因为printlnBigDecimal为时我没有错误,也没有语句输出null。当BigDecimal不是null预期值时,它会按预期方式工作,并且会打印出“ Class = class java.math.BigDecimal” ,而BigDecimal是0.00时,我的确会--在页面上输出。
println
--
我正在使用JSF 2.1,Mojarra 2.1.27
我还使用以下内容测试我的转换器。
<h:outputText value="#{null}"> <f:converter converterId="my.bigDecimalConverter" /> </h:outputText>
阅读此问题,似乎转换器应该使用null值。 https://stackoverflow.com/a/19093197/50262
您发布的链接说,转换器应使用null,但不会说在每种情况下使用null值都会调用转换器。
具体来说,它并不表示当转换器 位于a内h:outputText且值为null 时将调用转换器。
h:outputText
如果您挖掘Mojarra的资源,您将看到:
//Line 355 -- com.sun.faces.renderkit.html_basic.HtmlBasicRenderer //method getCurrentValue Object currentObj = getValue(component); if (currentObj != null) { currentValue = getFormattedValue(context, component, currentObj); }
显然,空值将永远不会被转换!而且我找不到解决方法。
然后,如果您 真的需要 将值设置为null(可以返回0或类似的值),我认为唯一的机会就是制作自定义渲染器。这很简单:
您编写的渲染器将覆盖重要的方法:
package my; import javax.faces.component.UIComponent; import javax.faces.component.UIInput; import javax.faces.context.FacesContext; import com.sun.faces.renderkit.html_basic.TextRenderer; public class HtmlCustomRenderer extends TextRenderer { @Override public String getCurrentValue(FacesContext context, UIComponent component) { if (component instanceof UIInput) { Object submittedValue = ((UIInput) component).getSubmittedValue(); if (submittedValue != null) { // value may not be a String... return submittedValue.toString(); } } String currentValue = null; Object currentObj = getValue(component); //Remove the 'if' to call getFormattedValue even if null currentValue = getFormattedValue(context, component, currentObj); return currentValue; } }
然后我们在faces-config.xml中声明渲染器:
<render-kit> <renderer> <component-family>javax.faces.Output</component-family> <renderer-type>javax.faces.Text</renderer-type> <renderer-class>my.HtmlCustomRenderer</renderer-class> </renderer> </render-kit>
现在,您的转换器将使用空值调用!
希望对您有所帮助!