我真的需要在Validators中检查null吗?

时间:2012-01-01 01:28:17

标签: jsf-2

我在某处读到,从JSF 2.0开始,验证器例程需要正确处理value参数为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 语句会解析为true?如果我没有NPE,它会在现实生活中发生吗?

2 个答案:

答案 0 :(得分:2)

事实上,绑定到<h:selectBooleanCheckbox>组件的属性永远不会为空。如果您不选中此框,则会false,反之亦然。因此,您无需在null中查看Validator

此外,对于任何其他UIInput组件,我相信您只需将required属性设置为truenull即可自动处理<h:inputText id="myInput" required="true" requiredMessage="Hey yo! Type something here." /> <h:message for="myInput" /> 个案例。例如,

Hey yo! Type something here.

如果用户错过了上面的文本框,他会在点击提交后看到{{1}}消息。

答案 1 :(得分:1)

如果valuenull,则!(value instanceof Boolean)也会返回truenull不是Boolean的实例)

因此,您可以简化此操作以消除支票的value == null部分而无需更改功能或不必担心NPE - 消除您的“繁琐的构造”:

if (!(value instanceof Boolean)) {