【问题标题】:JPA JSF Assign value to a null objectJPA JSF 为空对象赋值
【发布时间】:2015-10-04 19:04:48
【问题描述】:

我的时区下午好。

我正在开发一个同时使用 JSF 和 JPA 的 Web 应用程序。 有一个屏幕包含多个复选框,如下所示:

 option1   check1  check2
 option2   check1  check2
 option3   check1  check2

在数据库中,检索复选框值的查询使用一个 LEFT JOIN(这是业务逻辑)来检索复选框值: Select * FROM Option LEFT OUTER JOIN CheckBoxType ....

类图是这样的:

  class Option
       String label
       checkBoxType checkBox

  class CheckBoxType
       boolean value;

最终的结果是,它可能存在一个“选项”列表,其中一些包含为NULL的checkBox变量。

在JSF中我们使用如下代码:

<ui:repeat var="assocCheck" value="#{checkBean.getOptions}">
      <h:selectBooleanCheckBox name="#{assocCheck.label}" value="#{assocCheck.checkBox.value}"/>
</ui:repeat>

要显示结果没有问题,如果“选项”对象包含复选框为空,则屏幕上的复选框显示为 NO 值,当我将其中一个复选框设置为 true 并尝试保存时他们,JSF 抛出一个异常,告诉我以下内容

javax.faces.component.UpdateModelException: javax.el.PropertyNotFoundException: ....xhtml @45,126 value="#{assocCheck.checkBox.value}": Target Unreachable, 'null' returned null

我明白为什么会发生这种情况,处理此类问题的最佳方法是什么?可以在复选框上添加 valueChangeListener(每次复选框被填满时,bean 上都有一个创建 checkBox 对象的方法) 是最好的方法吗?

提前致谢 最好的问候

【问题讨论】:

    标签: jsf jpa


    【解决方案1】:

    我会在你的 Option 类中使用惰性设置器/获取器:

    @Entity
    public class Option {
        @...ToOne(optional = true, ...)
        private CheckboxType checkbox;
    
        public boolean isCheckboxChecked() {
            return checkbox != null && checkbox.getValue();
        }
    
        public void setCheckboxChecked(boolean checked) {
            if (checkbox == null) {
                if (!checked) {
                    // No need to create a CheckboxType
                    return;
                }
                checkbox = new CheckboxType();
            }
            checkbox.setValue(checked);
        }
    }
    

    现在您可以在 JSF 页面中使用它:

    <h:selectBooleanCheckBox name="#{option.label}" value="#{option.checkBoxChecked}"/>
    

    我为什么要使用这种方法:它将业务逻辑附加到业务对象。尤其是隐式声明 checkbox == nullcheckbox.value == false 的含义相同被显式化了。

    顺便说一句:我会将 Checkbox.value 重命名为 Checkbox.checked - 从我的角度来看,这会让事情变得更清楚:checkbox.isChecked()checkbox.getValue()(甚至更糟的是 checkbox.isValue())。

    【讨论】:

      猜你喜欢
      • 2019-03-14
      • 1970-01-01
      • 2011-03-14
      • 2015-01-21
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      • 2019-12-25
      相关资源
      最近更新 更多