托管bean属性值未设置为null

时间:2010-05-17 14:44:06

标签: java jsf null converter

我是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?

提前致谢。

2 个答案:

答案 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