我在某处读到,从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,它会在现实生活中发生吗?
答案 0 :(得分:2)
事实上,绑定到<h:selectBooleanCheckbox>
组件的属性永远不会为空。如果您不选中此框,则会false
,反之亦然。因此,您无需在null
中查看Validator
。
此外,对于任何其他UIInput
组件,我相信您只需将required
属性设置为true
,null
即可自动处理<h:inputText id="myInput" required="true" requiredMessage="Hey yo! Type something here." />
<h:message for="myInput" />
个案例。例如,
Hey yo! Type something here.
如果用户错过了上面的文本框,他会在点击提交后看到{{1}}消息。
答案 1 :(得分:1)
如果value
为null
,则!(value instanceof Boolean)
也会返回true
(null
不是Boolean
的实例)
因此,您可以简化此操作以消除支票的value == null
部分而无需更改功能或不必担心NPE - 消除您的“繁琐的构造”:
if (!(value instanceof Boolean)) {