Problemas com managed-bean

6 respostas
icarometal

Boa tarde galera.

estou com um problema que está me encucando Há um tempo.
tenhp um Bean, e uma tela em jsp.

meu bean possui seus atributos e respectivos gets e sets.
o problema, é que quando vou gravar os dados no banco, e tento recuperar os valores nos meus atributos, eles estão como null!

é como se eu não tivesse digitado nada na tela.

o value dos campos no meu Xhtml está preenchido absolutamente correto, mas no bean, como se eu não tivesse feito nada…

:shock:

alguem pode me ajudar?

obrigado!

6 Respostas

anderson.bonavides

Já olhou se os valores estão chegando no Bean? Voce pode botar um System.out.println() para verificar isso. Posta seu código aqui.

icarometal

fera, verifiquei sim...

tanto que se eu escrever algo na tela, e depois escolher aopção limpar, ele seta tudo pra null, corretamente!
mas se eu mando enviar os valores nada.. :(

meu código:

este é o bean:
package com.clinimed.view;

import java.util.ArrayList;
import java.util.List;

import javax.faces.model.ListDataModel;

import com.clinimed.controller.MedicoCtr;
import com.clinimed.model.Medico;
@SuppressWarnings("unchecked")
public class MedicoAction extends Medico{

	private ListDataModel lstMedico; 
	private String acao;
	private static String inserir_acao = "inserir";
	private static String editar_acao = "editar";
	
	public MedicoAction() {
		super();
		setLstMedico(new ListDataModel(new ArrayList()));
		setAcao(null);
		limpar();
	}

	public void setLstMedico(ListDataModel lstMedico) {
		this.lstMedico = lstMedico;
	}

	public ListDataModel getLstMedico() {
		return lstMedico;
	}

	public void setAcao(String acao) {
		this.acao = acao;
	}

	public String getAcao() {
		return acao;
	}

	public String gravar() {
      Medico med = new Medico();
        med.setNome(getNome());
		med.setTelefone(getTelefone());
		med.setSexo(getSexo());
		med.setCelular(getCelular());
		med.setCodigo(getCodigo());
		med.setCpf(getCpf());
		med.setCrm(getCrm());
		med.setEndereco(getEndereco());
		med.setEspecialidade(getEspecialidade());
		med.setLocalidade(getLocalidade());
		
	   MedicoCtr medctr = new MedicoCtr();	
		if(getAcao().equals(editar_acao)){
		  medctr.editarMedico(med);	
		} else if (getAcao().equals(inserir_acao) ){
		  medctr.insereMedico(med);
		}
		return "medicosSel";		
	}

	public String editar() {
		Medico medico = (Medico) getLstMedico().getRowData();
		setNome(medico.getNome());
		setTelefone(medico.getTelefone());
		setSexo(medico.getSexo());
		setCelular(medico.getCelular());
		setCodigo(medico.getCodigo());
		setCpf(medico.getCpf());
		setCrm(medico.getCrm());
		setEndereco(medico.getEndereco());
		setEspecialidade(medico.getEspecialidade());
		setLocalidade(medico.getLocalidade());
		setAcao(editar_acao);
		return "medicosMan";
	}
	
	public String pesquisar(){
		limpar();
		return "medicosSel";
	}

	public void excluir() {
		limpar();
	
	}

	public String novo() {		
		limpar();
		this.setAcao(inserir_acao);
		return "medicosMan";
	}

	public void localizar() {
		List<Medico> list = new ArrayList();
		MedicoCtr med = new MedicoCtr();
		list = med.listaMedico();
		setLstMedico(new ListDataModel(list));
		
	}
	
	public void limpar() {
		this.setNome(null);
		this.setTelefone(null);
		this.setSexo(null);
		this.setCelular(null);
		this.setCodigo(null);
		this.setCpf(null);
		this.setCrm(null);
		this.setEndereco(null);
		this.setEspecialidade(null);
		this.setLocalidade(null);
	}
	
}
e este meu xhtml
<?xml version="1.0" encoding="ISO-8859-1"?>
<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:rich="http://richfaces.ajax4jsf.org/rich"
xmlns:a4j="https://ajax4jsf.dev.java.net/ajax">
<ui:composition template="/WEB-INF/templates/layout/screen.xhtml">
	<ui:define name="botao">
		<h:form>
			<h:commandButton value="#{applicationResources.evt_label_gravar}" action="#{medicoAction.gravar}" />
			<h:commandButton value="#{applicationResources.evt_label_pesquisar}" action="#{medicoAction.pesquisar}" />
			<h:commandButton value="#{applicationResources.evt_label_limpar}" action="#{medicoAction.limpar}" rendered="#{medicoAction.codigo == null}" />
		</h:form>
	</ui:define>

	<ui:define name="title">
		<h:outputText value="#{applicationResources.label_medicoMan}" />
	</ui:define>

	<ui:define name="body">
		<h:form>
		 <script src='#{facesContext.externalContext.requestContextPath}/resources/scripts/jquery.js' type="text/javascript"></script> 
		<center>
		<table>
			<tr>
				<td>
					<rich:panelBar> 
					  <rich:panelBarItem label="Dados Pessoais">
						<table>
							<tr>
								<td><h:outputLabel for="nome" value="#{applicationResources.label_nome}" /></td>
								<td><h:outputLabel for="cpf" value="#{applicationResources.label_cpf}" />:</td>
								<td><h:outputLabel for="crm" value="#{applicationResources.label_crm}" /></td>
								<td><h:outputLabel for="sexo" value="#{applicationResources.label_sexo}" /></td>
							</tr>
							<tr>
								<td><h:inputText id="nome" value="#{medicoAction.nome}" size="50"
								requiredMessage="Nome obrigatório." required="true"/>
								<h:message for="nome" errorStyle="color: darkred;"/>
							    </td>
								<td><h:inputText id="cpf" value="#{medicoAction.cpf}" size="15"
								requiredMessage="CPF deve ser preenchido." required="true">
								<rich:jQuery selector="#cpf" query="mask('[CPF removido]')"
										timing="onload" />
								</h:inputText>
							<h:message for="cpf" errorStyle="color: darkred;"/>			
								</td>
								<td><h:inputText id="crm" value="#{medicoAction.crm}" size="15"
								     requiredMessage="CRM deve ser preenchido." required="true" />
								    <h:message for="crm" errorStyle="color: darkred;"/>		 
								     </td>
								<td>	<rich:comboBox defaultLabel="Sexo"
								         id="sexo" value="#{medicoAction.sexo}" >
										
									</rich:comboBox>
								</td>
							</tr>
						</table>
				</rich:panelBarItem>	
					<rich:panelBarItem label="endereço">
						<table>
							<tr>
								<td><h:outputLabel for="endereco" value="#{applicationResources.label_endereco}" /></td>
								<td><h:outputLabel for="estado" value="#{applicationResources.label_estado}" /></td>
								<td><h:outputLabel for="cidade" value="#{applicationResources.label_cidade}" /></td>
							</tr>
							<tr>
								<td><h:inputText id="endereco" value="#{medicoAction.endereco}" size="50" /></td>
								<td>   <rich:comboBox defaultLabel="estado"
								        id="estado">
										<f:selectItem itemValue="Minas gerais" />
										<f:selectItem itemValue="São Paulo" />
										<f:selectItem itemValue="Rio de janeiro" />
									</rich:comboBox></td>
								<td><h:inputText id="cidade" size="25" /></td>
							</tr>
							<tr>
							    <td><h:outputLabel for="especialidade" value="#{applicationResources.label_especialidade}" /></td>	
							</tr>
							<tr>
  							  <td><rich:comboBox defaultLabel="especialidade"
								        id="especialidade">
										
									</rich:comboBox>
							  </td>	
							</tr>
						</table>
					</rich:panelBarItem>
					<rich:panelBarItem  label="Contato">
						<table>
							<tr>
								<td><h:outputLabel for="residencial" value="#{applicationResources.label_telefone_residencial}" /></td>
							</tr>
							<tr>
								<td><h:inputText id="residencial" value="#{medicoAction.telefone}" size="25" >
								  <rich:jQuery selector="#residencial" query="mask('(99) - 9999 - 9999')"
										timing="onload" />
										<h:message for="residencial" errorStyle="color: darkred;"/>
								</h:inputText></td>
								<td></td>
							</tr>
							<tr>
								<td><h:outputLabel for="celular" value="#{applicationResources.label_telefone_celular}" /></td>
							</tr>
							<tr>
								<td><h:inputText id="celular" value="#{medicoAction.celular}" size="25" >
								<rich:jQuery selector="#celular" query="mask('(99) - 9999 - 9999')"
								timing="onload" />
								<h:message for="celular" errorStyle="color: darkred;"/>
								</h:inputText></td>
							</tr>														
						</table>
					</rich:panelBarItem>
					</rich:panelBar>
				</td>
			</tr>
		</table>
		</center>		
	</h:form>	
	</ui:define>
</ui:composition>
</html>
anderson.bonavides

Faz isso aqui:

public class MedicoAction extends Medico{

	private ListDataModel lstMedico; 
	private String acao;
	private static String inserir_acao = "inserir";
	private static String editar_acao = "editar";
	
	public MedicoAction() {
		super();
		setLstMedico(new ListDataModel(new ArrayList()));
		setAcao(null);
		limpar();
	}

	public String gravar() {
      Medico med = new Medico();
//modificação para teste.

        System.out.println("\n\n\nNome: "+ med.setNome(getNome()));
		System.out.println("Telefone:" + med.setTelefone(getTelefone()));
		System.out.println("Sexo: "+med.setSexo(getSexo()));
		System.out.println("Celular: "+med.setCelular(getCelular()));
		System.out.println("Codigo: "+ med.setCodigo(getCodigo()));
		System.out.println("CPF: "+ med.setCpf(getCpf()));
		System.out.println("CRM: "+med.setCrm(getCrm()));
		System.out.println("Endereco: "+ med.setEndereco(getEndereco()));
		System.out.println("Especialidade: "+ med.setEspecialidade(getEspecialidade()));
		System.out.println("Localidade: "+ med.setLocalidade(getLocalidade()+ "\n\n\n");
		
	   MedicoCtr medctr = new MedicoCtr();	
		if(getAcao().equals(editar_acao)){
		  medctr.editarMedico(med);	
		} else if (getAcao().equals(inserir_acao) ){
		  medctr.insereMedico(med);
		}
		return "medicosSel";		
	}

}
Tenta isso aqui e retorna para ver se houve sucesso.
icarometal

então…

fiz o que o amigo indicou…
e o retorno de tudo é null…

está acontecendo o que estou suspeitando… só não sei como corrigir…

tipo, se eu passo os valores pras propriedades dentro do bean, elas aparecem na tela, ou sela, a ligação entre eles está sendo feita correta…

vc saberia me dizer em qual momento a bean recebe o valor da tela? tipo através do set do atributo, em qual momento, ele recebe este valor? no submit? no momento em que eu digito nos inmputtext?

cara, ser iniciante nas coisas é um problema… rs…

[]'s!

anderson.bonavides

Os valores do managed bean chegam no momento que o action é chamado através do cammandbutton. O que vc precisa ver é se relamente seu Managed Bean está declarao de forma correta no faces-config.xml. Com certeza está existindo problema ai. Outra coisa, acredito que o problema pode está também no limpar do teu construtor. Tira isso daí e coloca em outro local. Quando o bean é chamado o construtor é chamado de imediato e está llimpando tudo. Então verifica estas 2 possibilidade ai.

icarometal

ok fera vou verificar aqui…

mas provavelmente é culpa do limpar mesmo…

o bean esta declarado certinho, porque esta tela, é o detalhe de um CRUD. Na tela que lista os dados, quando clico em um registro, ele chama esta mesma tela, passando os detalhes do mesmo… e ta funcionando certinh…
vou dar uma verificada aqui e volto ´para deixar a solução!

[]'s!

Criado 11 de abril de 2009
Ultima resposta 11 de abr. de 2009
Respostas 6
Participantes 2