Olá pessoal, eu estou com um problema complicado de explicar e gostaria da ajuda de vocês.
Estou desenvolvendo um cadastro para profissionais possui a seguinte regra: “Um profissional deve possuir pelo menos 1 especialização”, ou seja,
eu tenho um relacionamento n:n entre profissional e especialização. Criei o cadastro de profissionais, nesse cadastro eu tenho uma parte para adicionar
as especializações e relacioná-las com o profissional que está sendo gravado.
Se nenhum erro acontecer, o cadastro funciona perfeitamente, mas se um erro acontecer, eu não consigo adicionar nenhuma especialização. O evendo associado ao
botão adicionar simplesmente não dispara.
Estou colocando a imagem do problema (em anexo) e o código…agradeço qualquer ajuda.
Formulário:
<ui:composition template="/template/admintemplate.xhtml">
<ui:define name="conteudo">
<p:panel header="Cadastro de Profissional de Saúde">
<h:outputScript library="scripts" name="somentenumeros.js" />
<h:form id="frmcadprofissional">
<p:messages id="mensagens" showDetail="false" autoUpdate="true" closable="true"/>
<h:inputHidden id="profissionalid" value="#{profissionalBean.profissional.id}"/>
<h:inputHidden id="pessoaid" value="#{profissionalBean.pessoa.id}"/>
<h:panelGrid columns="2">
<h:outputLabel value="Documento *" for="documento"/>
<p:inputText id="documento" value="#{profissionalBean.pessoa.documento}"
size="14" maxlength="14" required="true" requiredMessage="Informe o número do documento"
onkeypress="return somenteNumero(event);">
<f:validator validatorId="documentoValidator"/>
<p:ajax event="change" update="pessoaid, nome, logradouro, numero, complemento, bairro, pngestado,
pngcidade, cep, telefone1, telefone2, email"
listener="#{profissionalBean.carregarDadosPessoa}"/>
</p:inputText>
<h:outputLabel value="Nome *" for="nome"/>
<p:inputText id="nome" value="#{profissionalBean.pessoa.nome}"
size="100" maxlength="100" required="true" requiredMessage="Informe o nome">
</p:inputText>
<h:outputLabel value="Sexo *" for="sexo"/>
<p:selectOneMenu id="sexo" value="#{profissionalBean.profissional.sexo}"
required="true" requiredMessage="Informe o sexo">
<f:selectItem itemValue="" itemLabel="Selecione o sexo"/>
<f:selectItem itemValue="M" itemLabel="Masculino"/>
<f:selectItem itemValue="F" itemLabel="Feminino"/>
</p:selectOneMenu>
<h:outputLabel value="Logradouro *" for="logradouro"/>
<p:inputText id="logradouro" value="#{profissionalBean.pessoa.logradouro}"
size="100" maxlength="100" required="true" requiredMessage="Informe o logradouro">
</p:inputText>
<h:outputLabel value="Número" for="numero"/>
<p:inputText id="numero" value="#{profissionalBean.pessoa.numero}"
size="20" maxlength="20" required="false">
</p:inputText>
<h:outputLabel value="Complemento" for="complemento"/>
<p:inputText id="complemento" value="#{profissionalBean.pessoa.complemento}"
size="20" maxlength="20" required="false">
</p:inputText>
<h:outputLabel value="Estado *" for="estado"/>
<h:panelGroup id="pngestado">
<p:selectOneMenu id="estado"
value="#{profissionalBean.estadoSelecionado}"
converter="estadoConverter"
effect="fade" style="width:160px"
required="true" requiredMessage="Selecione um estado">
<f:selectItem itemLabel="Selecione um estado" itemValue="" />
<f:selectItems value="#{profissionalBean.estadosCadastrados}" var="estado"
itemLabel="#{estado.nome}" itemValue="#{estado}"/>
<p:ajax event="change" listener="#{profissionalBean.carregarCidades}" update="pngcidade"/>
</p:selectOneMenu>
</h:panelGroup>
<h:outputLabel value="Cidade *" for="cidade"/>
<h:panelGroup id="pngcidade">
<p:selectOneMenu id="cidade"
value="#{profissionalBean.cidadeSelecionada}"
converter="cidadeConverter"
effect="fade" style="width:160px"
required="true" requiredMessage="Selecione uma cidade">
<f:selectItem itemLabel="Selecione uma cidade" itemValue="" />
<f:selectItems value="#{profissionalBean.cidades}" var="cidade"
itemLabel="#{cidade.nome}" itemValue="#{cidade}"/>
</p:selectOneMenu>
</h:panelGroup>
<h:outputLabel value="Bairro *" for="bairro"/>
<p:inputText id="bairro" value="#{profissionalBean.pessoa.bairro}"
size="50" maxlength="50" required="true" requiredMessage="Informe o bairro">
</p:inputText>
<h:outputLabel value="CEP" for="cep"/>
<p:inputMask id="cep" value="#{profissionalBean.pessoa.cep}"
mask="99999-999" converter="cepConverter"
validatorMessage="Informe um CEP válido">
</p:inputMask>
<h:outputLabel value="Telefone 1" for="telefone1"/>
<p:inputMask id="telefone1" value="#{profissionalBean.pessoa.telefone1}"
mask="(99)9999-9999"
converter="telefoneConverter"
validatorMessage="Telefone 1 inválido">
</p:inputMask>
<h:outputLabel value="Telefone 2" for="telefone2"/>
<p:inputMask id="telefone2" value="#{profissionalBean.pessoa.telefone2}"
mask="(99)9999-9999"
converter="telefoneConverter"
validatorMessage="Telefone 2 inválido">
</p:inputMask>
<h:outputLabel value="Email *" for="email"/>
<p:inputText id="email" value="#{profissionalBean.pessoa.email}"
maxlength="100" size="100"
required="true" requiredMessage="Informe o email"
validatorMessage="Informe um email válido">
</p:inputText>
<h:outputLabel value="Conselho *" for="conselho"/>
<h:panelGroup id="pngconselho">
<p:selectOneMenu id="conselho"
value="#{profissionalBean.conselhoSelecionado}"
converter="conselhoConverter"
effect="fade" style="width:180px"
required="true" requiredMessage="Selecione um conselho">
<f:selectItem itemLabel="Selecione um conselho" itemValue="" />
<f:selectItems value="#{profissionalBean.conselhosCadastrados}" var="conselho"
itemLabel="#{conselho.descricao}" itemValue="#{conselho}"/>
</p:selectOneMenu>
</h:panelGroup>
<h:outputLabel value="Registro *" for="registro"/>
<p:inputText id="registro" value="#{profissionalBean.profissional.registroConselho}"
maxlength="50" size="50"
required="true" requiredMessage="Informe o registro no conselho">
</p:inputText>
<h:outputLabel value="UF *" for="ufconselho"/>
<h:panelGroup id="pngufconselho">
<p:selectOneMenu id="ufconselho"
value="#{profissionalBean.estadoConselho}"
converter="estadoConverter"
effect="fade" style="width:160px"
required="true" requiredMessage="Selecione um estado">
<f:selectItem itemLabel="Selecione um estado" itemValue="" />
<f:selectItems value="#{profissionalBean.estadosCadastrados}" var="estado"
itemLabel="#{estado.nome}" itemValue="#{estado}"/>
</p:selectOneMenu>
</h:panelGroup>
</h:panelGrid>
<!-- Criar form para manipulação das especializações. Olhar cadastros auxiliares -->
<h:panelGrid columns="3">
<h:outputLabel value="Especialização *" for="especializacao"/>
<h:panelGroup id="pngespecializacao">
<p:selectOneMenu id="especializacao"
value="#{profissionalBean.especializacaoSelecionada}"
converter="especializacaoConverter"
effect="fade" style="width:200px">
<f:selectItem itemLabel="Selecione uma especialização" itemValue="" />
<f:selectItems value="#{profissionalBean.especializacoesCadastradas}" var="especializacao"
itemLabel="#{especializacao.descricao}" itemValue="#{especializacao}"/>
<!--
O evento é disparado apenas para atribuir o valor selecionado à especializacaoSelecionada
O botão vai adicionar a especialização na lista
-->
<p:ajax event="change"/>
</p:selectOneMenu>
</h:panelGroup>
<p:commandButton action="#{profissionalBean.adicionarEspecializacao}" value="Adicionar" icon="ui-icon-check" style="margin:0"
process="@this" update="especializacao dttespecializacoes"/>
</h:panelGrid>
<p:dataTable id="dttespecializacoes" var="especializacao" value="#{profissionalBean.especializacoesDoProfissional}"
emptyMessage="Nenhuma especialização adicionada">
<p:column headerText="Descrição" sortBy="#{especializacao.descricao}">
<h:outputText value="#{especializacao.descricao}" />
</p:column>
<p:column headerText="Remover" style="text-align: center;">
<p:commandLink action="#{profissionalBean.removerEspecializacao}" update="dttespecializacoes" process="@this">
<h:graphicImage library="imagens" name="excluir.png" style="border:0;"/>
<f:setPropertyActionListener value="#{especializacao}" target="#{profissionalBean.especializacaoSelecionada}"/>
</p:commandLink>
</p:column>
</p:dataTable>
<br/>
<p:commandButton action="#{profissionalBean.salvar}" value="Salvar" ajax="false" icon="ui-icon-check" style="margin:0"/>
</h:form>
</p:panel>
</ui:define>
</ui:composition>
ManagedBean:
package skymedic.profissionaldesaude;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import sistemasas.endereco.Estado;
import skymedic.conselho.Conselho;
import skymedic.conselho.ConselhoBusiness;
import skymedic.conselho.ConselhoFactory;
import skymedic.especializacao.Especializacao;
import skymedic.especializacao.EspecializacaoBusiness;
import skymedic.especializacao.EspecializacaoFactory;
import skymedic.pessoa.PessoaBean;
import skymedic.utils.ExibeMensagem;
@ManagedBean(name="profissionalBean")
@ViewScoped
public class ProfissionalDeSaudeBean extends PessoaBean {
private final String PAGINA_PROFISSIONAL_CADASTRO = "profissionalcadastro";
private final String PAGINA_PROFISSIONAL_EDICAO = "/global/profissionalcadastro?faces-redirect=true&includeViewParams=true";
private final String PAGINA_PROFISSIONAL_LISTA = "profissionallista";
private ProfissionalDeSaude profissional;
private List<ProfissionalDeSaude> profissionaisCadastrados;
private List<ProfissionalDeSaude> profissionaisConsultados;
private List<Especializacao> especializacoesCadastradas;
private List<Especializacao> especializacoesDoProfissional;
private Especializacao especializacaoSelecionada;
private List<Conselho> conselhosCadastrados;
private Conselho conselhoSelecionado;
private Estado estadoConselho;
@PostConstruct
private void iniciarProfissionalDeSaudeBean() {
this.profissional = ProfissionalDeSaudeFactory.criarProfissionalDeSaude();
this.profissionaisCadastrados = null;
this.profissionaisConsultados = null;
this.especializacaoSelecionada = null;
this.especializacoesCadastradas = null;
this.especializacoesDoProfissional = null;
this.conselhosCadastrados = null;
this.conselhoSelecionado = null;
this.estadoConselho = null;
iniciarPessoaBean();
}
public ProfissionalDeSaude getProfissional() {
return profissional;
}
public void setProfissional(ProfissionalDeSaude profissional) {
this.profissional = profissional;
this.conselhoSelecionado = this.profissional.getConselho();
this.estadoConselho = this.profissional.getUfConselho();
this.especializacoesDoProfissional = this.profissional.getEspecializacoes();
setPessoa(this.profissional.getPessoa());
}
public List<ProfissionalDeSaude> getProfissionaisConsultados() {
return profissionaisConsultados;
}
public void setProfissionaisConsultados(List<ProfissionalDeSaude> profissionaisConsultados) {
this.profissionaisConsultados = profissionaisConsultados;
}
public Especializacao getEspecializacaoSelecionada() {
return especializacaoSelecionada;
}
public void setEspecializacaoSelecionada(Especializacao especializacaoSelecionada) {
this.especializacaoSelecionada = especializacaoSelecionada;
}
public Conselho getConselhoSelecionado() {
return conselhoSelecionado;
}
public void setConselhoSelecionado(Conselho conselhoSelecionado) {
this.conselhoSelecionado = conselhoSelecionado;
}
public Estado getEstadoConselho() {
return estadoConselho;
}
public void setEstadoConselho(Estado estadoConselho) {
this.estadoConselho = estadoConselho;
}
public List<ProfissionalDeSaude> getListagem() {
if (this.profissionaisCadastrados == null) {
ProfissionalDeSaudeBusiness business = ProfissionalDeSaudeFactory.criarProfissionalBusiness();
this.profissionaisCadastrados = business.listar();
}
return this.profissionaisCadastrados;
}
public List<Especializacao> getEspecializacoesCadastradas() {
if (this.especializacoesCadastradas == null) {
EspecializacaoBusiness especializacaoBusiness = EspecializacaoFactory.criarEspecializacaoBusiness();
this.especializacoesCadastradas = especializacaoBusiness.listar();
}
return this.especializacoesCadastradas;
}
public List<Conselho> getConselhosCadastrados() {
if (this.conselhosCadastrados == null) {
ConselhoBusiness conselhoBusiness = ConselhoFactory.criarConselhoBusiness();
this.conselhosCadastrados = conselhoBusiness.listar();
}
return this.conselhosCadastrados;
}
public List<Especializacao> getEspecializacoesDoProfissional() {
if (this.especializacoesDoProfissional == null) {
this.especializacoesDoProfissional = new ArrayList<Especializacao>();
}
return this.especializacoesDoProfissional;
}
public String novo() {
return PAGINA_PROFISSIONAL_CADASTRO;
}
public String editar() {
return PAGINA_PROFISSIONAL_EDICAO;
}
public String salvar() {
try {
this.profissional.setPessoa(getPessoa());
this.profissional.setConselho(this.conselhoSelecionado);
this.profissional.setUfConselho(this.estadoConselho);
this.profissional.setEspecializacoes(this.especializacoesDoProfissional);
ProfissionalDeSaudeBusiness business = ProfissionalDeSaudeFactory.criarProfissionalBusiness();
business.salvar(this.profissional);
iniciarProfissionalDeSaudeBean();
ExibeMensagem.exibirMensagemOK("Profissional de saúde gravado com sucesso");
return PAGINA_PROFISSIONAL_LISTA;
} catch(Exception e) {
ExibeMensagem.exibirMensagemErro(e.getMessage().split(System.getProperty("line.separator")));
}
return null;
}
public String excluir() {
try {
ProfissionalDeSaudeBusiness business = ProfissionalDeSaudeFactory.criarProfissionalBusiness();
business.excluir(this.profissional);
iniciarProfissionalDeSaudeBean();
ExibeMensagem.exibirMensagemOK("Profissional de saúde excluido com sucesso");
return PAGINA_PROFISSIONAL_LISTA;
} catch(Exception e) {
ExibeMensagem.exibirMensagemErro(e.getMessage().split(System.getProperty("line.separator")));
}
return null;
}
public void adicionarEspecializacao() {
if (this.especializacaoSelecionada != null) {
if (! this.especializacoesDoProfissional.contains(this.especializacaoSelecionada)) {
this.especializacoesDoProfissional.add(this.especializacaoSelecionada);
}
this.especializacaoSelecionada = null;
}
}
public void removerEspecializacao() {
boolean removeu = this.especializacoesDoProfissional.remove(this.especializacaoSelecionada);
if (removeu) {
this.especializacaoSelecionada = null;
}
}
}