Erro SelectOneMenu com primifaces, sistema em EJB3.1

7 respostas
jeferson_alves

Boa tarde a todos, estou desenvolvendo um sistema Web com EJB3.1, JSF2.0, primifaces 3.4.
Para resumir , meu erro está no selectOneMenu do primifaces, na hora de fazer o insert aparece o seguinte erro(Erro de conversão ao definir o valor '30' para 'null Converter'. )
Minhas entidades já estão com hachcode() e equals().
Já estou no meu limite, alguem pode me ajudar? Deus abençoe

(Meu Converter)

package br.com.startup.s3.util;

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


import javax.faces.component.UIComponent;
import javax.faces.component.UISelectItems;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;

import javax.faces.convert.FacesConverter;
import javax.faces.model.SelectItem;





@FacesConverter(value = "contatoConverter")
public class ContatoConverter implements Converter{

	private int index;  
	  
    public Object getAsObject(FacesContext facesContext, UIComponent uicomp, String value) {  
        List<SelectItem> items = new ArrayList<SelectItem>();  
        List<UIComponent> uicompList = uicomp.getChildren();  
        for(UIComponent comp: uicompList){  
            if(comp instanceof UISelectItems){  
                items.addAll((List<SelectItem>) ((UISelectItems)comp).getValue());  
            }  
        }  
        return "-1".equals(value) ? null :  items.get(Integer.valueOf(value)).getValue();  
    }  
  
    public String getAsString(FacesContext facesContext, UIComponent uicomp, Object entity) {  
        return entity == null ? "-1" : String.valueOf(index++);  
    }  
  

	

}


(Meu SelectOneMenu)

                                                <h:outputText value="Clientes: " />  
					        <p:selectOneMenu value="#{contatoBean.contato.cliente}" effect="fade" converter="#{contatoConverter}"> 
					            <f:selectItem itemLabel="-Escolha-" itemValue="#" />   
					            <f:selectItems value="#{contatoBean.clientes}" var="contato" itemLabel="#{contato.nome}" itemValue="#{contato.idCliente}"/> 
					        </p:selectOneMenu>  




(Meu Managed Bean)

package br.com.startup.s3.controller;

import java.util.List;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;


import br.com.startup.s3.ejb.ClienteFacadeBean;
import br.com.startup.s3.ejb.ContatoFacadeBean;
import br.com.startup.s3.entidade.Cliente;
import br.com.startup.s3.entidade.Contato;
import br.com.startup.s3.ex.StartupException;

@ManagedBean(name="contatoBean")
@SessionScoped
public class ContatoBean {
	
	
	
	@EJB
	private ContatoFacadeBean contatoFacade;
	
	@EJB
	private ClienteFacadeBean clienteFacade;
	
	
	private Contato contato;
	private Cliente cliente;
	private List<Contato>contatos;  
	private List<Cliente>clientes;
	
	public ContatoBean() {
		contato = new Contato();
	}

	
	//Inserir
		public void prepararInserir(){
			contato = new Contato();
		}
		
		public void prepararAtualizar(Integer id) throws StartupException{
			contato = contatoFacade.buscarContatoPelaChave(id);
			
		}
		
		
		public void inserir() throws StartupException{
			
			contatoFacade.inserirContato(contato);
			
			//Mensagem Growl
			FacesContext context = FacesContext.getCurrentInstance();  
	        context.addMessage(null, new FacesMessage("contato cadastrado com sucesso! "));
	        contato = new Contato();
			
		}
		
		public void atualizar() throws StartupException{
			
	        contatoFacade.alterarContato(contato);
			
			//Mensagem Growl
			FacesContext context = FacesContext.getCurrentInstance();  
	        context.addMessage(null, new FacesMessage("contato atualizado com sucesso! "));
	        contato = new Contato();
		}
		
		
		public void deletar() throws StartupException{
			FacesContext context = FacesContext.getCurrentInstance();
			boolean resultado =  contatoFacade.removerContato(contato);
			
			 if (resultado) {
				 contato = new Contato();
				 context.addMessage(null, new FacesMessage("contato removido com sucesso!"));
			 } else {
			 context.addMessage(null, new FacesMessage("Falha ao remover contato!"));
			}
			
		}


		
		
		/////GET e Set
		
		public ContatoFacadeBean getContatoFacade() {
			return contatoFacade;
		}


		public void setContatoFacade(ContatoFacadeBean contatoFacade) {
			this.contatoFacade = contatoFacade;
		}


		public Contato getContato() {
			return contato;
		}


		public void setContato(Contato contato) {
			this.contato = contato;
		}


		
		public List<Contato> getContatos() throws StartupException {
			contatos = contatoFacade.buscarTodosContato();
			return contatos;
		}


        
		
	
	
	//////////////////////////////////Clientes
		
		
		
		
		

		public ClienteFacadeBean getClienteFacade() {
			return clienteFacade;
		}


		public Cliente getCliente() {
			return cliente;
		}


		public void setCliente(Cliente cliente) {
			this.cliente = cliente;
		}


		public void setClienteFacade(ClienteFacadeBean clienteFacade) {
			this.clienteFacade = clienteFacade;
		}


		public List<Cliente> getClientes() throws StartupException {
			clientes = clienteFacade.buscarTodosClientes();
			return clientes;
		}


		public void setClientes(List<Cliente> clientes) {
			this.clientes = clientes;
		}

	


	
	
	
	

	

	
	
	
}

7 Respostas

jweibe

Cara coloca teu código dentro das tag code fica mais fácil pra entender…

jeferson_alves

jweibe:
Cara coloca teu código dentro das tag code fica mais fácil pra entender…

Foi mal, é a primeira vez em um forum.

P

boa noite…

vc tem certeza que o

items.get(Integer.valueOf(value)).getValue()

está retornar um Cliente?

tá meio confusa a lógica desse seu converter…

P

se o seu

itemValue="#{contato.idCliente}"

é um “inteiro” é bem provavel que o seu converter

items.get(Integer.valueOf(value)).getValue()

esteja retornando um “inteiro” também…

então seu

value="#{contatoBean.contato.cliente}"
deve ser do mesmo tipo

jeferson_alves

paulovloghan:
se o seu

itemValue="#{contato.idCliente}"

é um “inteiro” é bem provavel que o seu converter

items.get(Integer.valueOf(value)).getValue()

esteja retornando um “inteiro” também…

então seu

value="#{contatoBean.contato.cliente}"
deve ser do mesmo tipo

É ele é um inteiro, fiz o converter de várias maneiras, e sempre estava dando erro de id null, pode ser isto mesmo, vou mudar, e te falo, é a primeira vez que trabalho com JSF e primifaces, estava trabalhando com JSP puro, e sistema cresceu d+ e precisei mudar tudo.

jeferson_alves
jeferson alves:
paulovloghan:
se o seu
itemValue="#{contato.idCliente}"

é um "inteiro" é bem provavel que o seu converter

items.get(Integer.valueOf(value)).getValue()
esteja retornando um "inteiro" também.... então seu
value="#{contatoBean.contato.cliente}"
deve ser do mesmo tipo

É ele é um inteiro, fiz o converter de várias maneiras, e sempre estava dando erro de id null, pode ser isto mesmo, vou mudar, e te falo, é a primeira vez que trabalho com JSF e primifaces, estava trabalhando com JSP puro, e sistema cresceu d+ e precisei mudar tudo.

Amigo eu mudei para

<h:outputText value="Clientes: " />  
					        <p:selectOneMenu value="#{contatoBean.contato.cliente.idCliente}" effect="fade" converter="#{contatoConverter}"> 
					            <f:selectItem itemLabel="-Escolha-" itemValue="#" />   
					            <f:selectItems value="#{contatoBean.clientes}" var="contato" itemLabel="#{contato.nome}" itemValue="#{contato.idCliente}"/> 
					        </p:selectOneMenu>

o erro mudou para

{contatoBean.contato.cliente.idCliente}": Target Unreachable, 'cliente' returned null

to mudando algumas coisas mas o erro persiste.

jeferson_alves

Alguem já viu isto?

Criado 17 de outubro de 2012
Ultima resposta 18 de out. de 2012
Respostas 7
Participantes 3