Строго отвечая на ваш вопрос, вам не нужно создавать экземпляр UIComponent в вашем контроллере, как вы это делали в своем коде, чтобы заставить работать ajax.
Вызов f:ajax
вызовет установщик для свойства вашего контроллера при указанном вами событии.Если вы не укажете какое-либо событие, будет вызвано событие по умолчанию для этого вида UIComponent.Для h:selectOneRadio
это valueChange
событие.
В любом случае вам необходимо указать правильное значение элемента для f:selectItems
.Если свойство, которое вы устанавливаете, является строкой, значение элемента должно быть строкой.Если свойство является пользовательским типом, который вы определили, вы должны создать конвертер для соответствующего преобразования значения.
В этом тесте значение, которое мы устанавливаем, является строкой, поэтому нам не нужноконвертер для него.
Я создал для вас небольшое тестовое приложение:
Контроллер
@ManagedBean
@ViewScoped
public class TestController implements Serializable
{
private static final long serialVersionUID = 1L;
private String teste;
public String getTeste()
{
return teste;
}
public void setTeste(String teste)
{
this.teste = teste;
}
}
Страница
<h:form>
<h:panelGrid id="meuGrid" columns="2">
<h:outputText value="Servidor" />
<h:selectOneRadio id="teste" value="#{testController.teste}">
<f:selectItem itemLabel="JBoss AS7" itemValue="AS7" />
<f:selectItem itemLabel="GlassFish" itemValue="GF3" />
<f:ajax execute="@this" render="resultado" />
</h:selectOneRadio>
<h:outputText value="Selecionado" />
<h:outputText id="resultado" value="#{testController.teste}" />
</h:panelGrid>
</h:form>
Вот и все.