2012-01-01 66 views
0

我从JSF 2.0的某个地方读到,验证器例程需要正确处理value参数为null的情况。于是我就写了这个validate方法,看起来像这样:我真的需要在验证器中检查null吗?

public void validateTandC(FacesContext context, UIComponent source, Object value) { 
    if (value == null || !(value instanceof Boolean)) { 
     FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, 
       "Terms and Conditions Not Accepted", "Value Not Present"); 
     throw new ValidatorException(fm); 
    } 
    if (((Boolean) value) != true) { 
     FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, 
       "Terms and Condistions Not Accepted", 
       "You must check the box that confirms you accept the Terms and Condtions "); 
     throw new ValidatorException(fm); 
    } 
} 

这是一个相当繁琐建设,因为在相关的页面,仅从单个h该方法仅简称:selectBooleanCheckbox。如果是这样的话,为什么第一个if声明永远解决为真?如果我没有,NPE会在现实生活中发生吗?

+0

相关:[验证必填复选框](http://balusc.blogspot.com/2008/09/validate-required-checkbox.html)。 – BalusC 2012-01-02 13:35:55

回答

2

由于事实上,一个绑定到<h:selectBooleanCheckbox>组件的属性将永远不会为空。如果您没有选中该框,则将是false,反之亦然。因此,您不需要检查Validator中的null

此外,对于任何其他UIInput组件,我相信你可以简单的required属性设置为truenull情况下将自动为您处理。例如,

<h:inputText id="myInput" required="true" requiredMessage="Hey yo! Type something here." /> 
<h:message for="myInput" /> 

如果用户错过了上面的文本框,他会点击提交按钮后看到Hey yo! Type something here.消息。

+0

这是我正在寻找的“验证”(无双关语意图)。我不确定所需的属性。当我有required =“true”和一个验证器=“#{bean.myValidator}”时,我结束了一些我无法理解的行为。我没有看太多,但我会再次回到土地的外观。 – AlanObject 2012-01-01 16:36:35

+0

@AlanObject'required'&'validator'属性不应该给对方带来麻烦。无论如何,如果你有任何问题,你总是可以创建一个新的问题:)。 – 2012-01-01 16:39:58

1

如果valuenull,然后!(value instanceof Boolean)也将返回truenull不是Boolean的实例)。

所以,你可以简化这个以消除你的支票的value == null部分不改变功能或不必担心一个NPE - 消除你的“繁琐的建设”:

if (!(value instanceof Boolean)) { 
+0

你说得对。最终,我在自己的陈述中输入了很多因坏习惯而多余的条款。 – AlanObject 2012-01-01 16:34:20

相关问题