невозможно установить параметр управляемого свойства со значением выражения JSF

У меня странная проблема, которую я пытался решить в течение некоторого времени, но застрял на одном месте и не совсем понимаю, что здесь происходит.

Моя индексная страница выглядит так:

<h:selectOneMenu id="selectMenu" value="#{indexBean.model.selected_id}" styleClass="indexItems">
    <f:selectItems value="#{indexBean.myModelValues}" />    
    <a4j:support event="onchange" reRender="peek" />        
</h:selectOneMenu> 
<br>
<h:outputText id="peek" value ="#{indexBean.model.selected_id}"/>
<br>
<a4j:commandButton value="Go to Form" action="form" styleClass="indexItems">
    <f:param name="selected" value="#{indexBean.model.selected_id}" />                                       
</a4j:commandButton>

CommandButton отправляет пользователя на следующую страницу, когда я хочу получить выбранную позицию из selectOneMenu. Проблема в том, что ничего не отправляется. Когда я выбираю какое-либо значение в меню, вывод текста "заглянуть" перерисовывается правильно, и я вижу правильный выбор. Однако он не отправляется на следующую страницу и Bean. Удивительно, когда я меняю значение параметра на фиксированную строку, это работает!!! То есть это:

<f:param name="selected" value="someValue1" />

Читается правильно в следующем Бине!!! Все bean-компоненты запрашиваются с аннотацией RichFaces @KeepAlive (я пробовал без аннотации, и это то же самое). Я пробовал: -изменить a4j:commandButton на h:commandLink или h:outputLink -изменить indexBean.model.selected_id на indexBean.selected_id -наконец изменить источник ввода с h:selectOneMenu на h:inputText

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

Здесь я размещаю фрагмент файлаfaces-config.xml:

<managed-bean>
    <managed-bean-name>indexBean</managed-bean-name>
    <managed-bean-class>id.webapp.beans.IndexBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
    <managed-bean-name>model</managed-bean-name>
    <managed-bean-class>id.webapp.beans.Model</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
    <managed-bean-name>formBean</managed-bean-name>
    <managed-bean-class>id.webapp.beans.FormBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
        <property-name>selectedValue</property-name>
        <value>#{param.selected}</value>
    </managed-property>
</managed-bean> 

Кто-нибудь знает, почему это не работает? Я использовал такие параметры управляемых свойств в прошлом, и это сработало (имеется в виду использование некоторых динамически изменяемых значений, а не статической строки).


person srd.pl    schedule 20.01.2012    source источник


Ответы (1)


<f:param> оценивается во время первоначального запроса (когда форма должна отображаться), а не во время запроса на отправку формы. Таким образом, оно по-прежнему остается исходным значением, а не измененным значением.

Дайте <a4j:commandButton> id и отправьте его также в reRender, чтобы его <f:param> был переоценен, прежде чем вы нажмете кнопку.

<h:selectOneMenu id="selectMenu" value="#{indexBean.model.selected_id}" styleClass="indexItems">
    <f:selectItems value="#{indexBean.myModelValues}" />    
    <a4j:support event="onchange" reRender="peek,button" />        
</h:selectOneMenu> 
<br>
<h:outputText id="peek" value ="#{indexBean.model.selected_id}"/>
<br>
<a4j:commandButton id="button" value="Go to Form" action="form" styleClass="indexItems">
    <f:param name="selected" value="#{indexBean.model.selected_id}" />                                       
</a4j:commandButton>
person BalusC    schedule 20.01.2012
comment
BalusC: спасибо, это работает. Я перерендерил outputText только для того, чтобы увидеть, правильно ли selectOneMenu присваивает значение. Однако теперь я вижу, что на самом деле нужно правильно передать параметр. Спасибо за ваш вклад. - person srd.pl; 20.01.2012
comment
Я не знаю, есть ли еще шанс на ответ, но я только сейчас заметил одну проблему с этим решением - оно будет работать только в том случае, если значение в selectOneMenu действительно изменено. Если не будет изменен (т.е. пользователь выбирает первый вариант по умолчанию), атрибут не устанавливается. Могу ли я как-то инициализировать параметр первым значением из selectOneMenu (значения заполняются динамически, поэтому их нельзя жестко закодировать). - person srd.pl; 10.02.2012
comment
Если свойство за #{indexBean.model.selected_id} равно null, задайте для него 1-е значение списка за #{indexBean.myModelValues} после его инициализации. - person BalusC; 10.02.2012
comment
В методе инициализации bean-компонента (@аннотация postconstruct) я устанавливаю model.selected_id. Когда страница загружается, она уже отображается как первое значение в меню, но не передается параметру. Чтобы получить это значение, мне нужно перейти на что-то еще, а затем вернуться к первому - явно нежелательно. - person srd.pl; 10.02.2012