我已经为输出java.math.BigDecimal创建了自定义Converter。当BigDecimal为0.00或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
方法未调用时。
@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 "";
}
}
我说它没有被调用是因为println
BigDecimal为时我没有错误,也没有语句输出null
。当BigDecimal不是null
预期值时,它会按预期方式工作,并且会打印出“
Class = class java.math.BigDecimal” ,而BigDecimal是0.00时,我的确会--
在页面上输出。
我正在使用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 时将调用转换器。
如果您挖掘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>
现在,您的转换器将使用空值调用!
希望对您有所帮助!
我构建了一个函数,用于将令牌存储在共享首选项中,然后在第一次运行应用程序时从服务器获取数据 生成AdminPage(dirty,state:AdminPageState#87BCD)时引发了以下NoSuchMethodError:Flutter:在Null时调用了方法“[]”.颤振:接收器:空颤振:尝试呼叫: 然后应用程序就可以正常工作了 附注。我的密码是 有什么不对劲的吗? 并且在调试模式下,错
我是Java新手,我正在尝试实现一个链表(我知道有一个链表类用于此目的,但从头开始就可以让我理解该语言在内部是如何工作的) 在main方法中,我声明了4个节点并初始化了3个。链表的头节点设置为空。第一次使用参数head和newNode调用add函数时,head为null,所以我初始化head并将newNode的值赋给它。在main方法中,我希望head对象应该从add方法中设置新的值。但头仍然是空
(免责声明:人们通过facebook、firebase等请求询问使用异步操作时数据为空/不正确时,会产生很多问题。我提出这个问题的目的是为每个从android异步操作开始的人提供一个简单的答案。) 我试图从我的一个操作中获取数据,当我使用断点或日志调试它时,值就在那里,但当我运行它时,它们总是空的,我该如何解决这个问题呢? 火力基地 脸书 等。
我的应用程序有问题,我想解决它,但我无法访问解决方案,请帮助我,,,
我正在开发一个具有蓝牙功能的应用程序。我使用一个片段来扫描并列出蓝牙设备。单击时,会回调到提供所选蓝牙设备的主要活动。 我一开始使用的是Android 6(API 23)的智能手机,然后不得不调整代码以适应Android 5.0(API 21)的使用。 我只是将minSDK更改为API21并重新构建了项目,没有任何问题。 该应用程序在智能手机上运行时没有任何问题。安装了Android5的平板电脑运
我是Android的新手,我正在开发一个应用程序,该应用程序试图连接服务器并获取Json响应,将其解析为类并使其可用。 为此,我上了三门课 公共类顾客{} 公共类ServerConnect{} 公共类JsonParser{} Serverconnect使用Volley库在异步线程上下载网页源代码。下载后,Server Connect类启动OnServerResponsed(String Respo