当实体为空时阻止 "Target Unreachable"
Prevent "Target Unreachable" when entity is null
我的 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;
}
没办法,如果对象为空,则无法定位其属性。
我会使用 rendered
方法,但如果 focusedPerson
为 null,则添加输出标签将打印适当的消息(仅当 focusedPerson
为 null 时才会呈现).
另一种常见的方法(但这取决于用例)是将 p:selectOneMenu
的值保存在一个单独的 bean 属性中,并在一个单独的操作中将其设置为 focusedPerson
(保存,更新,或其他任何东西)。
<p:selectOneMenu id="eyeColorSelection"
value="#{bean.eyeColor}">
...
public void save() {
...
if (getFocusedPerson() != null) {
getFocusedPerson().setEyeColor(getEyeColor());
}
...
}
我会非常简单地使用两个互斥的 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>
我的 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;
}
没办法,如果对象为空,则无法定位其属性。
我会使用 rendered
方法,但如果 focusedPerson
为 null,则添加输出标签将打印适当的消息(仅当 focusedPerson
为 null 时才会呈现).
另一种常见的方法(但这取决于用例)是将 p:selectOneMenu
的值保存在一个单独的 bean 属性中,并在一个单独的操作中将其设置为 focusedPerson
(保存,更新,或其他任何东西)。
<p:selectOneMenu id="eyeColorSelection"
value="#{bean.eyeColor}">
...
public void save() {
...
if (getFocusedPerson() != null) {
getFocusedPerson().setEyeColor(getEyeColor());
}
...
}
我会非常简单地使用两个互斥的 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>