我是JSF的新手,所以这个问题可能很奇怪。我有一个inputText组件的值绑定到托管bean的Float类型的属性。我需要在inputText字段为空时将property设置为null,而不是0值。默认情况下没有这样做,所以我添加了转换器,实现了以下方法:
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) throws ConverterException {
if (StringUtils.isEmpty(arg2)) {
return null;
}
float result = Float.parseFloat(arg2);
if (result == 0) {
return null;
}
return result;
}
我注册了转换器,并将其分配给inputText组件。我记录了arg2参数,并且还记录了getAsObject方法的返回值。根据我的日志,我可以看到它返回null值。但是,我还在back bean上记录setter属性,参数是0值,不是预期的null。更确切地说,它是setter属性被调用两次,一次是null参数,第二次是0值参数。
它仍然将支持bean值设置为0.如何将值设置为null?
提前致谢。
答案 0 :(得分:3)
我知道这是一个老帖子,但它帮助了我。我想在我的webapp中添加一段代码片段来设置BalusC提到的变量,而不必将其作为VM参数提供:
public class ServletContextListenerImpl
implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
System.getProperties().put(
"org.apache.el.parser.COERCE_TO_ZERO", "false");
}
}
我不能保证部署我的webapp的人会正确地将VM参数添加到Tomcat 6启动脚本中,所以我觉得将它嵌入我的webapp代码更安全。这让我的问题消失了。我正在使用Apache MyFaces JSF 1.2。
在我的webapp中,问题是支持bean上的一个Double字段,它被赋值为0.0而不是null。
答案 1 :(得分:2)
在null
中返回getAsObject()
时,您还需要将组件的提交值设置为null
。
if (result == null) {
((EditableValueHolder) component).setSubmittedValue(null);
}
但是有一个特定于环境的问题,即Tomcat 6.0.16或更高版本中的EL解析器仍然会在视图端将此值强制为0,即使getAsString()
返回{{1 }}。你可以通过在Tomcat的VM参数中添加以下行来解决这个问题:
null