Значение t: радио не передается Backing Bean в Myfaces 2.1
У меня есть проблема, когда значение t:radio (связанное с t:selectOneRadio) не передается компоненту поддержки. В настоящее время мы конвертируем из JSF 1.x в JSF 2.x, используя MyFaces 2.1.13 на Jboss 7.2.0, и у нас есть версия 2.0 библиотеки Tomahawk. Я часами пробовал разные вещи, чтобы заставить его работать и искал все выше и ниже, но не могу найти никого другого, кто сталкивался с такой же проблемой. Я определил, что сеттер никогда не вызывается после проверки значения.
Я извлек код и упростил его, но до сих пор ничего не передается при вызове ajax.
<h:form id="profileReport">
<h:messages />
<h:panelGrid columns="2">
<t:selectOneRadio id="selectQuestionnaire" layout="spread" required="true"
value="#{viewProfile.selectedQuestionnaire}">
<f:selectItem itemValue="SC_PRE!20121212095427.0000000.059814626868021525" />
<f:ajax event="click" execute="@this" render="profileReport:selectTemplate profileReport" />
</t:selectOneRadio>
<h:outputLabel for="selectQuestionnaire" value="#{prmsgs.firstQuestionnaireLabel}" styleClass="labelText" />
<t:radio index="0" for="profileReport:selectQuestionnaire" />
<h:outputLabel for="selectTemplate" value="#{prmsgs.exploratoryProcessTemplate}:" styleClass="labelText" />
<h:selectOneListbox id="selectTemplate" value="#{viewProfile.selectedInterpretiveProfileTemplateId}" required="#{menuNavigation.selectInterpretiveProfileActive}">
<f:selectItems value="#{viewProfile.interpretiveProfileTemplates}"/>
</h:selectOneListbox>
</h:panelGrid>
</h:form>
Просто для целей тестирования я заменил t: selectOneRadio на h: selectOneRadio, и вызывается сеттер. Затем я попробовал t: selectOneRadio без t: radio, и это сработало. Так что, похоже, проблема с t: radio, хотя я не уверен, что это на данный момент. Я знаю, что Icefaces имеет схожую функциональность, но я не хочу представлять еще одну полную библиотеку компонентов только для этого единственного использования в настоящее время. Мы стараемся минимизировать изменения настолько, насколько это возможно, поскольку это очень экономичный процесс конверсии.
1 ответ
Когда используется t:selectOneRadio layout="spread", t:selectOneRadio - это один компонент, а t: radio - другой компонент, даже если они работают вместе. В этом случае, когда выполняется запрос ajax, жизненный цикл выполняется через t: selectOneRadio, но он не выполняется для t:radio. Компонент f:ajax не может быть переопределен таким образом, поэтому невозможно включить t: radio в жизненный цикл после его запуска.