2015-02-18 3 views
0

У меня есть объект сфокусированным лицом в моем компоненте. Некоторые атрибуты этого сфокусированного человека связаны с элементами элементов в представлении.Предотвращение «Целевой недоступности», когда объект равен нулю

<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> 

Как и ожидалось, я получил следующее исключение, если никто не сфокусирован (focusPerson = 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; 
} 
+0

Предоставьте Bean код. – KSHiTiJ

+0

Вы имеете в виду, что вы действительно хотите отключить сам '', когда нет '# {bean.focusedPerson}'? Почему атрибут 'disabled', а затем' 'вместо' '? – BalusC

+0

@BalusC Избыточный атрибут должен быть в selectOneMenu. Ошибка копирования/вставки –

ответ

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> 
+0

Я выбрал этот путь, thx ! –

1

Ни в коем случае вокруг него, если объект является пустым, вы не можете предназначаться свои атрибуты.

Я хотел бы использовать rendered подход, но с добавлением выходной метки, будет напечатать соответствующее сообщение, если focusedPerson является недействительным (это сделало бы только в том случае focusedPerson равна нулю).

Другой общий подход (но это зависит от варианта использования) заключается в том, чтобы сохранить значение p:selectOneMenu в отдельном атрибуте bean и установить его в focusedPerson в отдельном действии (сохранить, обновить или что-либо еще).

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

 

public void save() { 
    ... 
    if (getFocusedPerson() != null) { 
     getFocusedPerson().setEyeColor(getEyeColor()); 
    } 
    ... 
} 
Смежные вопросы