Duvida [RESOLVIDO]

6 respostas
fnandos

Ola, não sei se alguém pode me ajudar mas é o seguinte, estou desenvolvendo uma aplicação com JSF 2.0 e tenho minha classe modelo Cidade da seguinte forma:

@Entity
@Table(name = "cidade")
@NamedQueries({
    @NamedQuery(name = "Cidade.findAll", query = "SELECT c FROM Cidade c")})
public class Cidade implements Serializable {
    @Id
    @Basic(optional = false)
    @Column(name = "cidcodigo", nullable = false)
    private Long cidCodigo;
    @Basic(optional = false)
    @Column(name = "nome", nullable = false, length = 100)
    private String nome;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "estsigla", nullable = false)
    private Estado estado;

    public Cidade() {
    }

    public Cidade(Long cidCodigo) {
        this.cidCodigo = cidCodigo;
    }

    public Cidade(Long cidCodigo, String nome) {
        this.cidCodigo = cidCodigo;
        this.nome = nome;
    }

    public Long getCidCodigo() {
        return cidCodigo;
    }

    public void setCidCodigo(Long cidCodigo) {
        this.cidCodigo = cidCodigo;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public Estado getEstado() {
        return estado;
    }

    public void setEstado(Estado estado) {
        this.estado = estado;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (cidCodigo != null ? cidCodigo.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof Cidade)) {
            return false;
        }
        Cidade other = (Cidade) object;
        if ((this.cidCodigo == null && other.cidCodigo != null) || (this.cidCodigo != null && !this.cidCodigo.equals(other.cidCodigo))) {
            return false;
        }
        return true;
    }

depois tenho meu Managed bean da seguinte forma:

@ManagedBean(name = "cidadeBean")
@SessionScoped
public class CidadeBean implements MB {

	private Cidade cidade;
	private Dao.Cidade cDao = DAOFactory.instance(DAOFactory.HIBERNATE).getCidade();
	private DataModel listaCidade;

	@Override
	public DataModel getLista() {
		List<Cidade> lista = HibernateUtil.getCurrentSession().getNamedQuery("Cidade.findAll").list();
		listaCidade = new ListDataModel(lista);
		return listaCidade;
	}

	@Override
	public void prepararAdicionar(ActionEvent evt) {
		setCidade(new Cidade());
	}

	@Override
	public void prepararAlterar(ActionEvent evt) {
		setCidade((Cidade) listaCidade.getRowData());
	}

	@Override
	public void adicionar(ActionEvent evt) {
		cDao.save(getCidade());
	}

	@Override
	public void alterar(ActionEvent evt) {
		cDao.save(getCidade());
	}

	@Override
	public String excluir() {
		cDao.delete((Cidade) listaCidade.getRowData());
		return "cidade";
	}

	//método para lookup de estados
	public List<SelectItem> getEstados() {
		List<SelectItem> toReturn = new LinkedList<SelectItem>();
		List<Estado> tudo = HibernateUtil.getCurrentSession().createQuery("from Estado e order by e.estSigla").list();
		for (Estado est : tudo) {
			toReturn.add(new SelectItem(est.getEstSigla(), est.getNome()));
		}
		return toReturn;
	}

	// gets e sets
	public Cidade getCidade() {
		return cidade;
	}

	public void setCidade(Cidade cidade) {
		this.cidade = cidade;
	}

e a na página está assim:

<h:outputLabel for="nome" value="Nome:" />
                    <h:inputText id="nome" value="#{cidadeBean.cidade.nome}"/>

                    <h:outputLabel for="estado" value="Estado:" />
                    <h:selectOneMenu id="estado" value="#{cidadeBean.cidade.estado}">                            												
							<f:selectItems value="#{cidadeBean.estados}"/>
					</h:selectOneMenu>

                    <p:commandButton update="tabela" oncomplete="dialogInCity.hide();" actionListener="#{cidadeBean.adicionar}" value="Inserir"/>
                    <p:commandButton oncomplete="dialogInCity.hide();" value="Cancelar"/>

Estou tendo problemas no adicionar e alterar, preparAlterar e excluir está ok, como faço para pegar o estado como objeto?

6 Respostas

jokacwb

Da pra fazer sim, mas vai precisar de um convert, segue um exemplo:

pagina.jsf

<h:selectOneMenu 
						value="#{formBean.componenteSelecionado.tipoComponente}"
						converter="FormularioTipoConverter">
 			            <f:selectItems  
			            	value="#{formBean.lstTipoComponentes}" 
			            	var="item" itemLabel="#{item.nome}"	itemValue="#{item}"/>  
			        </h:selectOneMenu>

ManagedBean

@SuppressWarnings("serial")
@SessionScoped
@ManagedBean(name = "formBean")
public class FormularioBean implements Serializable
{
	private ComponenteFormulario			componenteSelecionado = new ComponenteFormulario();
	private List<TipoComponenteFormulario>	lstTipoComponentes;

	public ComponenteFormulario getComponenteSelecionado()
	{
		return componenteSelecionado;
	}

	public void setComponenteSelecionado(ComponenteFormulario componenteSelecionado)
	{
		this.componenteSelecionado = componenteSelecionado;
	}

	public List<TipoComponenteFormulario> getLstTipoComponentes()
	{
		TipoComponenteFormulario vd = new TipoComponenteFormulario();
		vd.setNome("--Selecione--");
		lstTipoComponentes = new ArrayList<TipoComponenteFormulario>();
		lstTipoComponentes.add(vd);
		lstTipoComponentes.addAll(EJB.obterTiposComponenteFormulario());
		return lstTipoComponentes;
	}

	public void setLstTipoComponentes(List<TipoComponenteFormulario> lstTipoComponentes)
	{
		this.lstTipoComponentes = lstTipoComponentes;
	}
}

POJO do objeto TipoComponenteFormulario (Importante: os metodos equals e hashCode são indispensáveis para
o funcionamento se quiser saber porque leia isso (http://www.rponte.com.br/2008/02/01/selectonemenu-converter-erro-de-validacao/)

@SuppressWarnings("serial")
@Entity
@Table(name="tblTipoComponenteForm")
public class TipoComponenteFormulario implements Serializable
{
	@Id
	@Column(name="cvCodTipoCompForm",nullable=false)
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;

	@Column(name="ccCodigo",length=20,nullable=false,unique= true)
	private String codigo;

	@Column(name="ccNome",nullable=false,length=100)
	private String nome;
...
	@Override
	public int hashCode()
	{
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj)
	{
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		TipoComponenteFormulario other = (TipoComponenteFormulario) obj;
		if (id == null)
		{
			if (other.id != null)
				return false;
		}
		else if (!id.equals(other.id))
			return false;
		return true;
	}

Converter FormularioTipoConverter.java

@FacesConverter(value="FormularioTipoConverter",forClass=TipoComponenteFormulario.class)
public class FormularioTipoConverter implements Converter
{
	public TipoComponenteFormulario getAsObject(FacesContext context, UIComponent component, String value) 
	{
		if(value == null || value.isEmpty())
			return null;
		
		FacesContext ctx = FacesContext.getCurrentInstance();
		ValueExpression ve = ctx.getApplication().getExpressionFactory()
		                     .createValueExpression(ctx.getELContext(), "#{formBean}", FormularioBean.class);
		FormularioBean bean = (FormularioBean) ve.getValue(ctx.getELContext());
		TipoComponenteFormulario ftc = null;
		ftc =  bean.obterTipoCompomente(Integer.valueOf(value));
		if (ftc==null)
			System.out.println("Falha nno converter de tipo de compomente null");
		return ftc;
	}
 
	public String getAsString(FacesContext context, UIComponent component, Object object) 
	{
		if (object == null || object.toString().isEmpty())
			return "0";

		TipoComponenteFormulario tipo = (TipoComponenteFormulario) object;
		if(tipo == null || tipo.getId() == null)
		{
			return "0";
		}
		return tipo.getId().toString();
	}
}

Tente ai, e diga como c saiu.

jokacwb

Cara esqueci de dizer, seria interessante mudar este post para “Desenvolvimento Web” acho que só moderadores podem mover.
Outra Coisa seria legal tb, mudar o Assunto para algo mais acessível, por exemplo “SelectOneMenu + JSF2 + Converter”

fnandos

Valeu parceiro era isso mesmo.

MaYaRa_SaN

Oi jokacwb,

estava usando teu exemplo para tentar resolver meu problema e fiquei com uma duvida. o método bean.obterTipoCompomente(Integer.valueOf(value)); que voce chama na linha 14 do converter seria um método no menagedBean que faz uma requisição ao banco?

agradeço a ajuda desde já.

jokacwb

Oi Mayara

é exatamente isso q vc disse, trata-se do método que recebe o id (chave primaria) e retorna o objeto escolhido no combo.

J

Tentei seguir o exemplo, mas deu erro:

Se alguem puder me ajudar a resolver esse erro, agradeço.

CONVERTER:

package sgm.converter;

import javax.el.ValueExpression;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.FacesConverter;
import sgm.controller.CategoriaController;
import sgm.model.Categoria;

@FacesConverter(value = "categoriaConverter", forClass = Categoria.class)
public class CategoriaConverter {

    public Categoria getAsObject(FacesContext context, UIComponent component, String value) {
        if (value == null || value.isEmpty()) {
            return null;
        }

        FacesContext ctx = FacesContext.getCurrentInstance();
        ValueExpression ve = ctx.getApplication().getExpressionFactory().
                createValueExpression(ctx.getELContext(), "#{categoriaController}", CategoriaController.class);
        CategoriaController bean = (CategoriaController) ve.getValue(ctx.getELContext());
        Categoria obj = null;
        
        obj = bean.getCategoria(Integer.valueOf(value));
        
        if (obj == null) {
            System.out.println("Falha no converter da categoria - null");
        }
        
        return obj;
    }

    public String getAsString(FacesContext context, UIComponent component, Object object) {
        if (object == null || object.toString().isEmpty()) {
            return "0";
        }

        Categoria categoria = (Categoria) object;
        
        if (categoria == null || categoria.getId() == null) {
            return "0";
        }
        
        return categoria.getId().toString();
    }
}

Se precisarem de mais codigos ou da stacktrace completa, é só falar

Criado 8 de junho de 2011
Ultima resposta 17 de dez. de 2011
Respostas 6
Participantes 4