当实体为空时,防止“目标无法访问”

时间:2015-02-18 12:35:38

标签: jsf jsf-2 primefaces

我的bean中有一个专注的人物对象。这个焦点人物的一些属性与视图中的primefaces元素相关联。

<p:selectOneMenu id="eyeColorSelection"
    value="#{bean.focusedPerson.eyeColor}" disabled="#{bean.noPersonFocused}">
    <f:selectItems
        value="#{bean.eyeColorsToSelect}"
        var="eyeColor" itemLabel="#{eyeColor.i18nLabel}"
        itemValue="#{eyeColor}" />
    <f:ajax
        listener="#{bean.eyeColorSelectionChanged}" />
</p:selectOneMenu>

如预期的那样,如果没有人聚焦(focusedPerson = null),我会得到以下异常。

Caused by: javax.el.PropertyNotFoundException: Target Unreachable, 'focusedPerson' returned null

但我该如何处理呢?我的第一个想法是不渲染selectOneMenu,如果没有人专注,但这不是我想要的。 selectOneMenu应始终可见。

Bean代码:

private Person focusedPerson

public Person getFocusedPerson() {
    return this.focusedPerson;
}

public EyeColor[] getEyeColorsToSelect() {
    return EyeColor.values();
}

public boolean isNoPersonFocused() {
    return this.focusedPerson == null;
}

2 个答案:

答案 0 :(得分:1)

没有办法,如果对象为null,则无法定位其属性。

我会使用rendered方法,但添加了输出标签,如果focusedPerson为空,则会打印相应的消息(仅当focusedPerson为空时才会呈现)。

另一种常见方法(但这取决于用例)是将p:selectOneMenu的值保存在单独的bean属性中,并在单独的操作中将其设置为focusedPerson(保存,更新,或其他任何事情)。

<p:selectOneMenu id="eyeColorSelection"
    value="#{bean.eyeColor}">
...

public void save() {
    ...
    if (getFocusedPerson() != null) {
        getFocusedPerson().setEyeColor(getEyeColor());
    }
    ...
}

答案 1 :(得分:1)

我非常简单地使用两个selectOneMenu组件,互斥

<p:selectOneMenu id="eyeColorSelection" value="" 
    rendered="#{bean.noPersonFocused}" disabled="true" />
<p:selectOneMenu id="eyeColorSelection" value="#{bean.focusedPerson.eyeColor}" 
    rendered="#{not bean.noPersonFocused}">
   <f:selectItems value="#{bean.eyeColorsToSelect}" var="eyeColor" 
      itemLabel="#{eyeColor.i18nLabel}" itemValue="#{eyeColor}" />
      <f:ajax listener="#{bean.eyeColorSelectionChanged}" /> 
</p:selectOneMenu>