Jsf 防止;“无法达到目标”;当实体为空时

Jsf 防止;“无法达到目标”;当实体为空时,jsf,jsf-2,primefaces,Jsf,Jsf 2,Primefaces,我的bean中有一个焦点人物对象。该焦点人物的某些属性与视图中的primefaces元素相关联 <p:selectOneMenu id="eyeColorSelection" value="#{bean.focusedPerson.eyeColor}" disabled="#{bean.noPersonFocused}"> <f:selectItems value="#{bean.eyeColorsToSelect}" var="

我的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>
但是我该怎么处理呢?我的第一个想法是,如果没有人专注,就不要渲染selectOneMenu,但这不是我想要的。SelectOne菜单应始终可见

Bean代码:

private Person focusedPerson

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

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

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

如果对象为null,则无法将其属性作为目标

我将使用
rendered
方法,但添加了一个输出标签,如果
focusedPerson
为null,则该标签将打印适当的消息(仅当
focusedPerson
为null时才会渲染)

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


我将非常简单地使用两个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代码。你的意思是,当没有
{Bean.focusedPerson}
时,你真的想禁用
本身吗?为什么禁用了
属性而不是
?@BalusC Sorry disabled属性应该在selectOneMenu中。复制/粘贴错误我想提出一些建议。。如果(person==nulll)person=new person(),当没有person焦点时,可以在person对象的getter方法中初始化person对象

<p:selectOneMenu id="eyeColorSelection"
    value="#{bean.eyeColor}">
...
public void save() {
    ...
    if (getFocusedPerson() != null) {
        getFocusedPerson().setEyeColor(getEyeColor());
    }
    ...
}
<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>