Итак, у меня составной компонент. Внутри него у меня есть обычный текстовый ввод, использующий один из атрибутов составного компонента для значения.
<h:inputTextarea id="#{cc.attrs.id}Text" value="#{cc.attrs.value}">
<f:ajax event="blur" listener="#{someBean.onBlur}" />
</h:inputTextarea>
Как видите, у меня есть событие внутри текстового поля. Это событие открывает всплывающее окно и заполняет его текстом составного элемента управления. Он также сохраняет ссылку на составной элемент управления, вызвавший его. Позволь мне показать тебе:
public void onBlur(AjaxBehaviorEvent event) {
this.fieldReference = (UIInput) event.getSource();
this.formula = this.fieldReference.getValueExpression("value")
.getValue(FacesContext.getCurrentInstance().getELContext())
.toString();
this.displayPopup = true;
}
Все идет нормально. Теперь проблема возникает, когда я пытаюсь закрыть всплывающее окно, а затем обновить значение составного компонента значением, введенным во всплывающем окне. Я пытаюсь сделать это:
public void accept(ActionEvent event) {
this.fieldReference
.getValueExpression("value")
.setValue(FacesContext.getCurrentInstance().getELContext(), this.formula);
this.displayPopup = false;
}
Когда я пытаюсь это сделать, я получаю:
javax.el.PropertyNotFoundException: //C:/myProject/Path/compositeComponentPage.xhtml at line 22 and column 183 value="#{cc.attrs.value}": Target Unreachable, identifier 'cc' resolved to null
Мне кажется, что контекст EL в этом запросе отличается и, следовательно, не может разрешать переменные в выражениях составного компонента... но если я попытаюсь также сохранить ссылку на объект ELContext из запроса составного компонента (в методе onBlur()
), то когда я пытаюсь использовать его в accept()
, я получаю:
javax.faces.event.AbortProcessingException: java.lang.IllegalStateException: Error the FacesContext is already released!
Используя MyFaces 2.0.2 (версия, которая поставляется с WebSphere 8.5, я думаю, что они модифицируют ее) и RichFaces 4.2.3.
Любые идеи?