Olá pessoal,
Meu problema é com JSF. Tenho um h:selectOneMenu de Especialidades e um h:selectOneMenu de Medicos. Quando seleciono uma especialidade o h:selectOneMenu de Médicos é populado com os Médicos daquela especialidade. Isto está funcionando e estou fazendo com Ajax. O problema é que quando eu faço o submit deste formuláro ocorre um erro como se os dados do médico não tivessem setados no meu objeto Consulta (que possue estes dois atributos e alguns mais).
Pelo que eu entendi este problema é por causa do Ajax. Faço uma requisão ajax para trazer os médicos e outra requisição Ajax para salvar a Consulta no banco, mas não sei por que estou tento esse problema. Já estudei o ciclo de vida da requisão JSF mas não encontrei a resposta. É como se meu componente médico não estivesse sendo setado.
O Tomcat me retorna o warning abaixo.
[color=red]01/10/2011 01:07:29 org.apache.tomcat.util.http.Parameters processParameters
INFO: Parameters: Invalid chunk ‘=10’ ignored.[/color]
Minha Página
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.prime.com.tr/ui">
<p:panel header="Consulta" id="panel">
<h:panelGrid columns="3">
<h:outputLabel value="Convênio: " for="consulta-convenio" />
<h:selectOneMenu id="consulta-convenio"
value="#{consultaBean.consulta.convenio}">
<f:converter converterId="entityConverter" />
<f:selectItem itemLabel="Selecione..." itemValue="" />
<f:selectItems value="#{convenioBean.listaConvenios}" var="conv"
itemLabel="#{conv.nome}" itemValue="#{conv}" />
</h:selectOneMenu>
<p:message for="consulta-convenio" />
<h:outputLabel value="Especialidade: " for="consulta-especialidade" />
<h:selectOneMenu id="consulta-especialidade"
value="#{medicoBean.especialidadeId}">
<f:ajax event="change" render="consulta-medico"
listener="#{medicoBean.listenerMedicosByEspecialidade}" />
<f:selectItem itemLabel="Selecione..." itemValue="" />
<f:selectItems value="#{especialidadeBean.listaEspecialidades}"
var="esp" itemLabel="#{esp.descricao}" itemValue="#{esp.id}" />
</h:selectOneMenu>
<p:message for="consulta-especialidade" />
<h:outputLabel value="Médico: " for="consulta-medico" />
<h:selectOneMenu id="consulta-medico"
value="#{consultaBean.consulta.medico}">
<f:converter converterId="entityConverter" />
<f:selectItem itemLabel="Selecione..." itemValue="" />
<f:selectItems value="#{medicoBean.listaMedicosByEspecialidade}"
var="med" itemLabel="#{med.nome}" itemValue="#{med}" />
</h:selectOneMenu>
<p:message for="consulta-medico" />
<h:outputLabel value="Paciênte: " for="consulta-paciente" />
<h:selectOneMenu id="consulta-paciente" required="true"
value="#{consultaBean.consulta.paciente}">
<f:converter converterId="entityConverter" />
<f:selectItem itemLabel="Selecione..." itemValue="" />
<f:selectItems value="#{pacienteBean.listaPacientes}" var="pac"
itemLabel="#{pac.nome}" itemValue="#{pac}" />
</h:selectOneMenu>
<p:message for="consulta-paciente" />
<h:outputText value="Data da Consulta: " for="consulta-data" />
<p:inputMask id="consulta-data" required="true"
value="#{consultaBean.consulta.data}" mask="99/99/9999">
<f:convertDateTime timeZone="America/Sao_Paulo" pattern="dd/MM/yyyy" />
</p:inputMask>
<p:message for="consulta-data" />
<h:commandButton value="Salvar">
<f:ajax event="click" execute="@form"
listener="#{consultaBean.salvar}" render="@form" />
</h:commandButton>
</h:panelGrid>
</p:panel>
Meu ManagedBean
@ManagedBean
public class ConsultaBean {
@ManagedProperty(value = "#{entityManager}")
private EntityManager entityManager;
private Consulta consulta = new Consulta();
private List<Consulta> listaConsultas;
public EntityManager getEntityManager() {
return entityManager;
}
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
public Consulta getConsulta() {
return consulta;
}
public void setConsulta(Consulta consulta) {
this.consulta = consulta;
}
public List<Consulta> getListaConsultas() {
if (listaConsultas == null) {
listaConsultas = ServiceFactory.getInstance().getConsultaService().findAll(entityManager);
}
return listaConsultas;
}
public void salvar() {
ServiceFactory.getInstance().getConsultaService().insert(entityManager, consulta);
consulta = new Consulta();
listaConsultas = null;
}
public void remover(Consulta consulta) {
ServiceFactory.getInstance().getConsultaService()
.delete(entityManager, consulta);
listaConsultas = null;
}
}
Obs. Estou passando o objeto direto do meu h:selectOneMenu para minha Entity, mas o problema não é esse. Se eu coloco um h:selectOneMenu com todos os médicos e mando salvar no banco ele salva tudo corretamente. O problema é justamente com essas requisições Ajax =/
Desde já agradeço,
Adilson