JSF中值为null或true时如何设置selectBooleanCheckbox为选中状态
实现null/true值对应复选框选中的方案
p:selectBooleanCheckbox 原生仅识别标准布尔值true/false,默认会把null判定为未选中,要实现null和true都展示为选中,有两种可落地的方案,优先推荐第一种:
方案1:调整后端字段getter逻辑(最稳妥)
直接修改isRelevant字段的get方法,把null值统一转换为true返回即可,setter方法保持原有逻辑不变,完全不影响原有ajax事件、双向绑定的正常运行。
后端对应代码修改示例:
// 原有字段定义不用改 private Boolean isRelevant; public Boolean getIsRelevant() { // null值统一转换为true返回,满足选中要求 return isRelevant == null ? Boolean.TRUE : isRelevant; } // setter保持原有逻辑,正常接收复选框提交的布尔值即可 public void setIsRelevant(Boolean isRelevant) { this.isRelevant = isRelevant; }
前端组件代码不需要做任何修改,原有逻辑完全兼容。
方案2:自定义转换器实现(无需修改原有get/set)
如果不想改动原有字段的getter逻辑,可以自定义一个布尔转换器,在组件渲染阶段把null值转换为true,提交阶段正常处理布尔值即可。
- 先创建自定义转换器类:
import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.convert.Converter; import javax.faces.convert.FacesConverter; @FacesConverter("nullAsTrueBooleanConverter") public class NullAsTrueBooleanConverter implements Converter<Boolean> { @Override public Boolean getAsObject(FacesContext context, UIComponent component, String submittedValue) { // 表单提交时,选中状态会提交有效值,未选中返回null,正常转换为布尔值 return submittedValue != null; } @Override public String getAsString(FacesContext context, UIComponent component, Boolean modelValue) { // 页面渲染时,null或者true都返回true字符串,对应复选框选中状态 return modelValue == null || modelValue ? Boolean.TRUE.toString() : Boolean.FALSE.toString(); } }
- 给复选框组件添加转换器引用,修改后的前端代码:
<p:selectBooleanCheckbox value="#{dataSource.isRelevant}" styleClass="stateful" style="padding: 0 10px 5px 10px;" converter="nullAsTrueBooleanConverter"> <p:ajax event="change" process="@this" listener="#{dataSourceController.onChangeRelevantFilter(dataSource)}" /> </p:selectBooleanCheckbox>
注意:不要直接在
value属性写#{dataSource.isRelevant != false}这类只读EL表达式,会破坏JSF双向绑定,导致用户点击复选框后,修改的值无法正常写回后端字段。
内容的提问来源于stack exchange,提问作者Rustam
相关产品推荐
相关产品推荐

