Problema com selectOneMenu - Não insere dados no banco

5 respostas
M

Boa noite,

Venho através deste pedir ajuda para identificar um possível problema em uma aplicação que estou desenvolvendo. Não consigo identificar o erro de forma alguma, não aborta, não gera nenhuma crítica, apenas não faz nada.

Segue código abaixo:

Pais.java


import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity(name="Pais")
public class Pais implements Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 7160104646977079882L;

	@Id
	@Column(name="id")
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private long id;
	
	@Column(name="codigoBacen", length=5, unique=true, nullable=false)
	private int codigoBacen;
	
	@Column(name="sigla", length=2, nullable=false, unique=true)
	private String sigla;
	
	@Column(name="descricao", length=50, nullable=false, unique=true)
	private String descricao;
	
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public int getCodigoBacen() {
		return codigoBacen;
	}
	public void setCodigoBacen(int codigoBacen) {
		this.codigoBacen = codigoBacen;
	}
	public String getSigla() {
		return sigla;
	}
	public void setSigla(String sigla) {
		this.sigla = sigla;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	
	public boolean equals(Object obj){
		if(obj == null){
			return false;
		}
		
		if(getClass() != obj.getClass()){
			return false;
		}
		
		final Pais other = (Pais)obj;
		if(this.id != other.id){
			return false;
		}
		return true;
		
	}

}
PaisController.java


import java.util.Collection;

import javax.persistence.EntityManager;
import javax.persistence.Persistence;

import br.eti.mrs.webhair.model.Pais;

public class PaisController {
	
	private Collection<Pais> paises;
	private Pais pais;
	private Pais paisSelecionado;
	private EntityManager em = Persistence.createEntityManagerFactory("webhair").createEntityManager();
	
	public PaisController(){
		this.pais = new Pais();
		this.paisSelecionado = new Pais();
		this.paises = null;
	}

	public void confirmar(){
		em.getTransaction().begin();
		em.persist(this.pais);
		em.getTransaction().commit();
		this.pais = new Pais();
	}

	public void alterar(){
		em.getTransaction().begin();
		em.merge(this.paisSelecionado);
		em.getTransaction().commit();
		this.paisSelecionado = null;
	}

	public void excluir(){
		em.getTransaction().begin();
		em.remove(this.paisSelecionado);
		em.getTransaction().commit();
		this.paisSelecionado = null;
	}

	@SuppressWarnings("unchecked")
	public Collection<Pais> getPaises(){
		this.paises = em.createQuery("select a from Pais a").getResultList();
		return this.paises;
	}

	public void setPaises(Collection<Pais> paises) {
		this.paises = paises;
	}

	public Pais getPais() {
		return this.pais;
	}

	public void setPais(Pais pais) {
		this.pais = pais;
	}

	public Pais getPaisSelecionado() {
		return paisSelecionado;
	}

	public void setPaisSelecionado(Pais paisSelecionado) {
		this.paisSelecionado = paisSelecionado;
	}
	
}
PaisConverter.java


import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;

import br.eti.mrs.webhair.model.Pais;

public class PaisConverter implements Converter {

	private EntityManager em = Persistence.createEntityManagerFactory("webhair").createEntityManager();
	
	@Override
	public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String string) {
		// TODO Auto-generated method stub
		if(string == null){
			return null;
		}else{
			Pais pais = em.find(Pais.class, Long.parseLong(string)); 
			return pais;
		}
		
	}

	@Override
	public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object object) {
		// TODO Auto-generated method stub
		return null;	
	}

}
Uf.java


import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity(name="Uf")
public class Uf implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 5591635789426243372L;
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private long id;
	
	@Column(name="codigoIbge", length=2, nullable=false, unique=true)
	private int codigoIbge;
	
	@Column(name="sigla", length=2, nullable=false, unique=true)
	private String sigla;
	
	@Column(name="descricao", length=100, nullable=false, unique=false)
	private String descricao;
	
	@ManyToOne(optional=false)
	@JoinColumn(name="idPais", referencedColumnName="id")
	private Pais pais;
	
	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public int getCodigoIbge() {
		return codigoIbge;
	}
	
	public void setCodigoIbge(int codigoIbge) {
		this.codigoIbge = codigoIbge;
	}
	
	public String getSigla() {
		return sigla;
	}
	
	public void setSigla(String sigla) {
		this.sigla = sigla;
	}
	
	public String getDescricao() {
		return descricao;
	}
	
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Pais getPais() {
		return pais;
	}

	public void setPais(Pais pais) {
		this.pais = pais;
	}
	
	public boolean equals(Object obj){
		if(obj == null){
			return false;
		}
		
		if(getClass() != obj.getClass()){
			return false;
		}
		
		final Uf other = (Uf)obj;
		if(this.id != other.id){
			return false;
		}
		return true;
		
	}
	
}
UfController.java


import java.util.Collection;

import javax.persistence.EntityManager;
import javax.persistence.Persistence;

import br.eti.mrs.webhair.model.Uf;

public class UfController {
	
	private Collection<Uf> ufs;
	private Uf uf;
	private Uf ufSelecionada;
	private EntityManager em = Persistence.createEntityManagerFactory("webhair").createEntityManager();
	
	public UfController(){
		this.uf = new Uf();
		this.ufSelecionada = new Uf();
		this.ufs = null;
	}

	public void confirmar(){
		em.getTransaction().begin();
		em.persist(this.uf);
		em.getTransaction().commit();
		this.uf = new Uf();
	}

	public void alterar(){
		em.getTransaction().begin();
		em.merge(this.ufSelecionada);
		em.getTransaction().commit();
		this.ufSelecionada = null;
	}

	public void excluir(){
		em.getTransaction().begin();
		em.remove(this.ufSelecionada);
		em.getTransaction().commit();
		this.ufSelecionada = null;
	}

	@SuppressWarnings("unchecked")
	public Collection<Uf> getUfs(){
		this.ufs = em.createQuery("select a from Uf a").getResultList();
		return this.ufs;
	}

	public void setUfs(Collection<Uf> ufs) {
		this.ufs = ufs;
	}

	public Uf getUf() {
		return this.uf;
	}

	public void setUf(Uf uf) {
		this.uf = uf;
	}

	public Uf getUfSelecionada() {
		return ufSelecionada;
	}

	public void setUfSelecionada(Uf ufSelecionada) {
		this.ufSelecionada = ufSelecionada;
	}
}

Pagina que efetua a inclusão das Uf’s.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.prime.com.tr/ui"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">
<h:body>
	<h:head></h:head>
		<h:form id="form_ListarUfs">
			<p:dataTable id="datatable_ListarUfs"  var="var_uf" value="#{ufController.ufs}" 
				paginator="true" paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks}
				{NextPageLink} {LastPageLink} {RowsPerPageDropdown}" rowsPerPageTemplate="5,10,20,30,40"
				selection="#{ufController.ufSelecionada}" selectionMode="single" 
				onRowSelectUpdate="panelgrid_SelecionarUf" onRowSelectComplete="dialog_SelecionarUf.show()"	>
				<p:column sortBy="#{var_uf.codigoIbge}" filterBy="#{var_uf.codigoIbge}">
					<f:facet name="header">
						<h:outputText value="Código Ibge"/>
					</f:facet>
					<h:outputText value="#{var_uf.codigoIbge}"/>
				</p:column>
				<p:column sortBy="#{var_uf.sigla}" filterBy="#{var_uf.sigla}">
					<f:facet name="header">
						<h:outputText value="Sigla"/>
					</f:facet>
					<h:outputText value="#{var_uf.sigla}"/>
				</p:column>
				<p:column sortBy="#{var_uf.descricao}" filterBy="#{var_uf.descricao}">
					<f:facet name="header">
						<h:outputText value="Descrição"/>
					</f:facet>
					<h:outputText value="#{var_uf.descricao}"/>
				</p:column>
			</p:dataTable>
			
			<p:commandButton value="Incluir" onclick="dialog_IncluirUf.show()" process="@this"/>
		  
		  <p:dialog header="Detalhe Uf" widgetVar="dialog_SelecionarUf" resizable="true"
		  	 showEffect="explode" hideEffect="explode" width="500">
		  	<h:panelGrid id="panelgrid_SelecionarUf"  columns="2" cellpadding="4">
					<h:outputLabel id="label_SelecionarUf_codigoIbge" for="outputtext_SelecionarUf_codigoIbge" value="Código Ibge" />
					<h:outputText id="outputtext_SelecionarUf_codigoIbge" value="#{ufController.ufSelecionada.codigoIbge}"/>
					<h:outputLabel id="label_SelecionarUf_sigla" for="outputtext_SelecionarUf_sigla" value="Sigla" />
					<h:outputText id="outputtext_SelecionarUf_sigla" value="#{ufController.ufSelecionada.sigla}"/>
					<h:outputLabel id="label_SelecionarUf_descricao" for="inputtext_SelecionarUf_descricao" value="Descrição" />
					<p:inputText id="inputtext_SelecionarUf_descricao" value="#{ufController.ufSelecionada.descricao}"/>
		  	</h:panelGrid>
				<p:commandButton value="Alterar" actionListener="#{ufController.alterar}" 
					update="datatable_ListarUfs" oncomplete="dialog_SelecionarUf.hide()" />
				<p:commandButton value="Excluir" actionListener="#{ufController.excluir}" 
					update="datatable_ListarUfs" oncomplete="dialog_SelecionarUf.hide()"/>
		  </p:dialog>   	
  	</h:form>

	  <p:dialog header="Incluir Uf" widgetVar="dialog_IncluirUf" resizable="true"
	  	 showEffect="explode" hideEffect="explode" width="500" appendToBody="true" >
	  	<h:form>
	  		<h:panelGrid id="panelgrid_IncluirUf"  columns="2" cellpadding="4">
					<h:outputLabel id="label_IncluirUf_codigoIbge" for="inputtext_IncluirUf_codigoIbge" value="Código Ibge" />
					<p:inputText id="inputtext_IncluirUf_codigoIbge" value="#{ufController.uf.codigoIbge}"/>
					<h:outputLabel id="label_IncluirUf_sigla" for="inputtext_IncluirUf_sigla" value="Sigla" />
					<p:inputText id="inputtext_IncluirUf_sigla" value="#{ufController.uf.sigla}"/>
					<h:outputLabel id="label_IncluirUf_descricao" for="inputtext_IncluirUf_descricao" value="Descrição" />
					<p:inputText id="inputtext_IncluirUf_descricao" value="#{ufController.uf.descricao}"/>
					<h:outputLabel id="label_IncluirUf_pais" for="selectonemenu_IncluirUf_pais" value="Pais" />  
					<h:selectOneMenu id="selectonemenu_IncluirUf_pais"  value="#{ufController.uf.pais}">
						<f:selectItems value="#{paisController.paises}" var="var_listaPaises" 
							itemValue="#{var_listaPaises.id}" 
							itemLabel="#{var_listaPaises.sigla} - #{var_listaPaises.descricao}"/>
					</h:selectOneMenu>
	  		</h:panelGrid>
	  		<p:commandButton value="Resetar" type="reset"/>
				<p:commandButton value="Confirmar" actionListener="#{ufController.confirmar}" 
					update="form_ListarUfs @parent" oncomplete="dialog_IncluirUf.hide()" />
			</h:form>
	  </p:dialog>   	

  </h:body>
</html>

O que acontece e basicamente isto:

<h:selectOneMenu id="selectonemenu_IncluirUf_pais"  value="#{ufController.uf.pais}">
						<f:selectItems value="#{paisController.paises}" var="var_listaPaises" 
							itemValue="#{var_listaPaises.id}" 
							itemLabel="#{var_listaPaises.sigla} - #{var_listaPaises.descricao}"/>
					</h:selectOneMenu>

Neste ponto ele não seta o valor a ufController.uf.pais, e como consequência não faz mais nada. Efetuei o debug, e ao passar pelo PaisConverter, ele chega com valor, sendo o mesmo convertido corretamente, mas parece que depois disso o processo pará.

Desde já agradeço a ajuda de todos.

5 Respostas

R
&lt;h:selectOneMenu id="selectonemenu_IncluirUf_pais"  value="#{ufController.uf.pais}"&gt;  
                        &lt;f:selectItems value="#{paisController.paises}" var="var_listaPaises"   
                            itemValue="#{var_listaPaises.id}"   
                            itemLabel="#{var_listaPaises.sigla} - #{var_listaPaises.descricao}"/&gt;  
                    &lt;/h:selectOneMenu&gt;

kd o converter??

R

Mais algumas dicas:

-Use um converter genérico,assim vc n precisa ficar criando um converter para cada entidade:http://www.rponte.com.br/2008/07/26/entity-converters-pra-da-e-vender/

  • Mude o nome desses “var_listaPaises” pra algo mais legivel;

  • Nesse trecho,por exemplo;

public void confirmar(){  
        em.getTransaction().begin();  
        em.persist(this.pais);  
        em.getTransaction().commit();  
        this.pais = new Pais();  
    }

O código do controller ‘conhece’ demais os detalhes da camada de persistencia,isso deveria ser algo como:

public void confirmar(){
paisDAO.salvar(pais);
}

De preferência usando um DAO genérico e usando Spring pra realizar essa injeção.http://cagataycivici.wordpress.com/2007/09/10/using-spring-to-manage-jsf-beans/

M

Bom dia,

Então eu pretendo colocar o Spring para controlar as dependências, porém queria resolver este problema primeiro. Chegarei em casa hoje a noite e colocarei o Spring para efetuar o controle das dependências e o ajustarei o DAO. Porém gostaria que fossem pensando no problema exposto, pois, se eu levar em consideração que ele chega no Converter e retorna o objeto correto da classe Pais, como pode ele não efetuar a persistência dos dados no banco.

Tentei efetuar o debug, porém ele não chega a executar:

<p:commandButton value="Confirmar" actionListener="#{ufController.confirmar}"   
                    update="form_ListarUfs @parent" oncomplete="dialog_IncluirUf.hide()" />

Obrigado.

M

Bom dia Senhores,

Configurei o Spring para cuidar das transações, fiz um DAO para a classe tudo correto. Porém agora, eu não consigo iniciar a aplicação. Dá o erro: is not assignable to interface org.springframework.web.WebApplicationInitializer.

Alguém sabe porque dá esse erro?

jamirdeajr

Olá Marcelo,
Deve ter algum problema na configuração, dá uma olhada neste post, eles citam o mesmo erro:
http://www.guj.com.br/java/248990-spring-30–jsf-20

Ou vá diretamente neste links que tem exemplos de configuração para você comparar:
http://javafaces.wordpress.com/2010/12/02/exemplo-jsf-2-hibernate-3-spring-3/
http://vonjuliano.wordpress.com/2011/08/02/integrando-jsf-2-e-spring/

Abraço e boa sorte!

Criado 10 de agosto de 2011
Ultima resposta 4 de set. de 2011
Respostas 5
Participantes 3