Jsf

21 respostas
ricardocomp

Olá pessoal,
eu estou com uma dúvida
e por causa disso não estou
conseguindo resolver o meu problema:

<p>Produtor</p>
                        <h:form>
                            <h:selectOneMenu styleClass="dimensao_combo" value="#{SolicitacaoController.solicitacaoServico.produtor}">
                                 //Estou usando o ProdutorController ao invés de SolicitacaoController 
                                <f:selectItems value="#{ProdutorController.produtoresCombo}" />
                            </h:selectOneMenu>

                            <p>Número de Amostras</p>
                            <h:inputText  styleClass="dimensao_input" value="#{SolicitacaoController.solicitacaoServico.numeroAmostra}"/>

                            <p>Nome da Solicitação</p>
                            <h:inputText  styleClass="dimensao_input" value="#{SolicitacaoController.solicitacaoServico.nome}"/>
                            <h:messages />
                            <p>&nbsp;</p>
                            <h:commandButton value="Avançar" action="#{SolicitacaoController.create}" />
                        </h:form>

E toda hora que eu clico em avançar e executo o action do commandButton
aparece a seguinte mensagem na página jsf:

Conversion Error setting value '7' for 'null Converter'.

Esse 7 é o id do Endereço do Produtor.

Será que alguém poderia me dar uma ajuda
Fazendo o Favor?

[]'s.

21 Respostas

D

Ricardo,

a impressão que dá é que o atributo value do menu “{SolicitacaoController.solicitacaoServico.produtor}” está nulo…
inclusive “produtor” não pode estar nulo…

yorgan

Provavelmente você não está instanciando a classe solicitacaoServico.
Caso esteja, poste o código da classe SolicitacaoController para darmos uma olhada.

[]´s
Daniel

ricardocomp

Olá diegopctba,
nessa linha:

<f:selectItems value="#{ProdutorController.produtoresCombo}" />

o método produtoresCombo pega os produtores do banco e retorna
a String com o nome de cada produtor do banco para o combo.

Mas nessa linha:

<h:selectOneMenu styleClass="dimensao_combo" value="#{SolicitacaoController.solicitacaoServico.produtor}">

Eu preciso de um setar um objeto do tipo Produtor
mas pelo jeito eu estou passando uma String
que é o nome do produtor o problema
é que eu preciso pegar o próprio objeto Produtor
do combo mas se eu pegar o objeto
eu não sei como pegar o nome dele
no combo depois.

Será que alguém pdoeriame dar uma ajuda?
Fazendo o Favor?

[]'s.

2

Ricardo,

essa lista que você está mostrando no combo é do que? Tem que ser uma lista de SelectItem com os valores que você deseja setar. Você não pode, por exemplo, pegar uma lista de ids e passar pra f:selectItems.
Faltou alguns dados pra te ajudar melhor, mas esse erro de null converter é quando o JSF não consegue entender o valor de um atributo pela falta de um converter, por isso pensei nessa possibilidade por jsf não conhece long (id) , somente String.

Se o problema não for esse mande mais detalhes pra ver se podemos te ajudar.

[]´s

ricardocomp

Olá yorgan,
aqui esta o trecho aonde eu instâncio a Solicitação.

public String novaSolicitacao() throws SQLException, LAFQADaoException{
                ...
		this.solicitacao = new SolicitacaoServico();      
                ...                
		return "nova_solicitacao";

	}

[]'s.

D

Ricardo, poste o código dos beans que você está usando, e o código do “solicitacaoServico” também…

ricardocomp

Olá 22-Gers
a minha lista do combo eu fiz da seguinte maneira:

public class ProdutorController {
    
    private List<SelectItem> produtoresCombo;
    
    public List<SelectItem> getProdutoresCombo(){
         ...
            for (Produtor p : produtorServices.listarProdutores()) {
                //Vou adicionando a String do nome no combo
                this.produtoresCombo.add(new SelectItem(String.valueOf(p.getIdProdutor()), p.getNome()));
            }
         ...
     }
}

[]'s.

ricardocomp

Olá diegopctba
o meu código completo esta assim:

classe Solicitação de Serviço:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package model.BaseDados;

import exception.AmostraException;
import exception.SolicitacaoServicoException;
import java.util.List;

/**
 *
 * @author Ricardo Ramos
 */
public class SolicitacaoServico {

    private int protocolo;
    private Produtor produtor;
    private Tecnico tecnico;
    private String nome;
    private String data;
    private String hora;
    private int numeroAmostra;
    private List<Amostra> listaAmostra;

    public SolicitacaoServico(){
        
    }

    public SolicitacaoServico(int protocolo, Produtor produtor, Tecnico tecnico, String nome,
            String data, String hora, int numeroAmostra)
            throws SolicitacaoServicoException, AmostraException {

        this.protocolo = protocolo;
        this.produtor = produtor;
        this.tecnico = tecnico;
        this.nome = nome;
        this.data = data;
        this.hora = hora;
        //Faz as validações do número de amostras.
        this.setNumeroAmostra(numeroAmostra);
    }

    //Usa o set apenas para fazer a busca da solicitação por protocolo.
    public void setProtocolo(int protocolo) {
        this.protocolo = protocolo;
    }
    
    public int getProtocolo(){       
        return protocolo;
    }
    
    public Produtor getProdutor() {
        return produtor;
    }

    //Fazer o tratamento se o produtor é igual a null, ProdutorException.
    public void setProdutor(Produtor produtor) {
        System.out.println("Entrou no setProdutor!");
        this.produtor = produtor;
    }

    public Tecnico getTecnico() {
        return tecnico;
    }

    //Fazer o tratamento se o técnico é igual a null, TecnicoException.
    public void setTecnico(Tecnico tecnico) {
        this.tecnico = tecnico;
    }

    public String getData() {
        return data;
    }

    //Fazer o tratamento se a data for "" ou null, DatasHorasException.
    public void setData(String data) {
        this.data = data;
    }

    public String getHora() {
        return hora;
    }

    //Fazer o tratamento se a data for "" ou null, DatasHorasException.
    public void setHora(String hora) {
        this.hora = hora;
    }

    public String getNome() {
        return nome;
    }

    //Verificar se o nome é "" ou null, SolicitacaoServicoException.
    public void setNome(String nome) {
        this.nome = nome;
    }

    public int getNumeroAmostra() {
        return numeroAmostra;
    }

    public void setNumeroAmostra(int numeroAmostra) throws AmostraException {
        if(numeroAmostra > 0){
            this.numeroAmostra = numeroAmostra;
        }
        else{
            throw new AmostraException("O número de Amostras é Inválido!");
        }
    }

    public List<Amostra> getListaAmostra() {
        return listaAmostra;
    }

    public void setListaAmostra(List<Amostra> listaAmostra){       
        this.listaAmostra = listaAmostra;    
    }
        
}
ricardocomp

Meu ManagedBean:

public class SolicitacaoController {

	private SolicitacaoServico solicitacao;

	private DataModel model;

    /**
     * Construtor responsavel por criar um nova solicitação
     *
     * @return "novo"
     */
	public String novaSolicitacao() throws SQLException, LAFQADaoException{

                Calendar cal1 = Calendar.getInstance();
                String data = cal1.get(Calendar.YEAR) + "/" + (cal1.get(Calendar.MONTH)+1) + "/" + cal1.get(Calendar.DATE);

                FacesContext.getCurrentInstance().addMessage("", new FacesMessage("Criou a Data"));
      
                Calendar cal2 = Calendar.getInstance();
                String horario = cal2.get(Calendar.HOUR_OF_DAY) + ":" + cal2.get(Calendar.MINUTE) + ":" + cal2.get(Calendar.SECOND);

		this.solicitacao = new SolicitacaoServico();      
                this.solicitacao.setListaAmostra(new ArrayList<Amostra>());
                this.solicitacao.setData(data);
                this.solicitacao.setHora(horario);

		return "nova_solicitacao";

	}

    public String novaBusca(){

        this.solicitacao = new SolicitacaoServico();

        return "nova_busca";

    }

    public String novaListagem(){

        this.solicitacao = new SolicitacaoServico();

        return "nova_listagem";

    }
    /**
     * Método responsavél por fornecer a solicitação para a camada view
     * @return solicitacao
     */
	public SolicitacaoServico getSolicitacaoServico() {
            System.out.println("Entrou no getSolicitacao!");
            //System.out.println(this.solicitacao.getNumeroAmostra());
            //System.out.println("Nome do produtor: " + this.solicitacao.getProdutor().getEndereco().getIdEndereco());
            return this.solicitacao;

	}

    /**
     * Este método recebe a solicitacao da camada view
     * @param solicitacao
     */
	public void setSolicitacaoServico(SolicitacaoServico solicitacao) {
            System.out.println("Entrou no setSolicitacao!");
            this.solicitacao = solicitacao;

	}

    /**
     * Método responsavel por fazer a ligação entre
     * a camada view e camada model fornecendo para
     * a view uma lista com todas as solicitações cadastradas.
     *
     * Este método recebe a mensagem(Erro) do SolicitacaoServicoDao
     * que é repassada para o PrdoutorService que repassa
     * para este método do SolicitacaoController poder
     * exibir a mensagem de erro para o usuário.
     * @return
     */
     //O.K.!!!
    public DataModel getTodos(){
        System.out.println("Entrou no getTodos!");
        SolicitacaoServices solicitacaoServices;

        try{
            solicitacaoServices = new SolicitacaoServices();
            model = new ListDataModel(solicitacaoServices.listarSolicitacaoServicos());
        }
        catch (LAFQADaoException ex) {
            ex.printStackTrace();
            FacesContext.getCurrentInstance().addMessage
            ("", new FacesMessage("Não foi possível listar as solicitações!"));            
        }
        catch(SQLException ex){
            ex.printStackTrace();
            FacesContext.getCurrentInstance().addMessage
            ("", new FacesMessage("Houve um problema no Banco de Dados!"));
        }
        return model;

    }


    public String buscar(){

        SolicitacaoServices solicitacaoServices;

        try{
            solicitacaoServices = new SolicitacaoServices();
            this.solicitacao = solicitacaoServices.procurarSolicitacaoServico(this.solicitacao.getProtocolo());
        }
        catch (Exception ex) {
            ex.printStackTrace();
            novaBusca();
            FacesContext.getCurrentInstance().addMessage
            ("", new FacesMessage("Solicitação Não Encontrada!"));
            return "falhou_busca";
        }
        return "sucesso_busca";
    }

    /**
     * Método responsavél por pegar o registro
     * da solicitacao, retornando null caso o
     * registro não seja encontrado.
     *
     * @return Solicitação
     */
    public SolicitacaoServico getSolicitacaoFromEditOrDelete() {
        System.out.println("Entrou no getSolicitacaoFromEditOrDelete!");
        solicitacao = (SolicitacaoServico) model.getRowData();
        return solicitacao;
    }

    /**
     * Método que cria
     * @return
     */
    //O.K.!!!
    public String create() throws AnaliseException {
         System.out.println("Entrou no create!");
         SolicitacaoServices solicitacaoServices;
         FacesContext.getCurrentInstance().addMessage
         ("", new FacesMessage("Create!"));
        try{
            solicitacaoServices = new SolicitacaoServices();


            //Acho que o ERRO deve estar aqui nessa linha!!!
            int id = solicitacao.getProtocolo();
            System.out.println("O valor do ID = " + id);

            FacesContext.getCurrentInstance().addMessage
                ("", new FacesMessage("ID = " + id));
            if (id == 0) {
                solicitacaoServices.salvarSolicitacaoServico(solicitacao);               
                FacesContext.getCurrentInstance().addMessage
                ("", new FacesMessage("Solicitação Registrada com sucesso!"));
            }
            else {
                solicitacaoServices.atualizarSolicitacaoServico(solicitacao);
                FacesContext.getCurrentInstance().addMessage
                ("", new FacesMessage("Os dados da Solicitação foram atualizados!"));
            }
        }
        catch (LAFQADaoException ex) {
            ex.printStackTrace();
            FacesContext.getCurrentInstance().addMessage
            ("", new FacesMessage("Erro ao cadastrar ou atualizar!"));
            return "falha_ins";
        }
        catch (SQLException ex) {
            ex.printStackTrace();
            FacesContext.getCurrentInstance().addMessage
            ("", new FacesMessage("Houve um Problema no Banco de Dados!"));
            return "falha_ins";
        }
        catch (SolicitacaoServicoException ex) {
            ex.printStackTrace();
            FacesContext.getCurrentInstance().addMessage
            ("", new FacesMessage("Houve um Problema na Solicitação!"));
            return "falha_ins";
        }
        catch (AmostraException ex) {
            ex.printStackTrace();
            FacesContext.getCurrentInstance().addMessage
            ("", new FacesMessage("Houve um Problema na Amostra!"));
            return "falha_ins";
        }       
        catch (AnaliseException ex) {
            ex.printStackTrace();
            FacesContext.getCurrentInstance().addMessage
            ("", new FacesMessage("Impossível Salvar Antes de Calcular!"));
            return "falha_ins";
        }
        
        return "sucesso_ins";

    }

    //o.k.!!!
    public String delete(){
        System.out.println("Entrou no delete!");
        SolicitacaoServices solicitacaoServices;

        try{
            solicitacaoServices = new SolicitacaoServices();
            solicitacao = getSolicitacaoFromEditOrDelete( );
            solicitacaoServices.excluirSolicitacaoServico(solicitacao);
            FacesContext.getCurrentInstance().addMessage
            ("", new FacesMessage("Os dados da Solicitação foram excluidos!"));
        }
        catch (LAFQADaoException ex) {
            ex.printStackTrace();
            FacesContext.getCurrentInstance().addMessage("",
            new FacesMessage("Não foi possível excluir os dados da solicitação!"));
            return "falha_del";
        }
        catch(SQLException ex){
            ex.printStackTrace();
            FacesContext.getCurrentInstance().addMessage
            ("", new FacesMessage("Houve um problema no Banco de Dados!"));
            return "falha_del";
        }
        return "sucesso_del";
    }

    public String edit() {
        solicitacao = getSolicitacaoFromEditOrDelete();
        setSolicitacaoServico(solicitacao);
        return "editar";
    }

    public SolicitacaoServico busca(SolicitacaoServico solicitacao){
        if (solicitacao == null){
            FacesContext.getCurrentInstance().addMessage("",
            new FacesMessage("Erro Solicitação Não Encontrada!"));
        }
        else{
            solicitacao = getSolicitacaoFromEditOrDelete();
            setSolicitacaoServico(solicitacao);
            FacesContext.getCurrentInstance().addMessage("",
            new FacesMessage("Solicitação Registrada com sucesso!"));
        }
        return null;
    }

    public String registroTecnico(){

        return "regitro_tecnico";

    }

    public String registroProdutor(){

        return "regitro_produtor";

    }
}

Será que alguém pode me dar uma ajuda?

[]'s.

ricardocomp

Olá pessoal o código ficou
muito grande mas o método
que uso quando eu clico no
commandButton é o create.

Será que tem como alguém me dar
uma ajuda? :smiley:

[]'s.

ricardocomp

Olá pessoal
não sei se isso vai ajudar
mas quando eu falei
sobre o ERRO:

Conversion Error setting value '7' for 'null Converter'.

Esse valor 7 é o valor do id do Endereco do produtor
selecionado do combo.

[]'s.

D

Ricardo, fiz um teste aqui e consegui reproduzir seu erro…
Então, vamos por partes… lá no menu: &lt;h:selectOneMenu styleClass="dimensao_combo" value="#{SolicitacaoController.solicitacaoServico.produtor}"&gt; //Estou usando o ProdutorController ao invés de SolicitacaoController &lt;f:selectItems value="#{ProdutorController.produtoresCombo}" /&gt; &lt;/h:selectOneMenu&gt;

Em “#{ProdutorController.produtoresCombo}”, você precisa preencher uma lista de SelectItem, e em cada SelectItem, no método setValue você precisa passar um objeto da API java, no caso Integer, String, etc… exemplo: item.setValue(produtor.getId()); Note que setValue aceita qualquer tipo de objeto, inclusive de suas classes, mas ao executar, vai dar exatamente este erro que está acontecendo com você.

Resumindo, você está setando o valor de cada selectItem com seu próprio objeto, então minha sugestão, que sempre utilizo, é ao instanciar a lista de SelectItem, em setValue preencher com o id do objeto em questão, e no managed bean criar um atributo do mesmo tipo (no meu caso, Integer) para receber o valor selecionado no menu, e ao executar o método create(), instanciar um objeto Produtor de acordo o id selecionado, e setar em solicitacaoServico.produtor.

Talvez tenha ficado confuso da maneira que expliquei, mas espero que tenha entendido. Qualquer dúvida é só postar.

ricardocomp

Jóia diegopctba,
Seria mais ou menos isso?

this.produtoresCombo.add(new SelectItem(p.getNome()).setValue(p.getIdProdutor()));

Está dizendo que o void não é permitido,
esse método setValue() retorna alguma coisa?

[]'s.

ricardocomp

Seria isso daqui Diego?

for (Produtor p : produtorServices.listarProdutores()) {               
                item = new SelectItem(p.getNome());
                item.setValue(p.getIdProdutor());
                this.produtoresCombo.add(item);
            }

[]'s.

D

ricardo,

instanciar os atributos de SelectItem por construtor seria melhor assim:

this.produtoresCombo.add(new SelectItem(p.getIdProdutor(), p.getNome()));

preste atenção nos contrutores, pois se você passa parâmetro, o primeiro sempre é referente ao value, o segundo ao label, e assim por diante…

dê uma olhada na api do selectItem: http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/javax/faces/model/SelectItem.html

ricardocomp

Jóia diegopctba?

O meu Maneged Bean teria que ficar assim:

public class SolicitacaoController {
    //Os get's e set's desse atributo forma criados.
    private Integer idProdutor;
    
    public String create() throws AnaliseException {
         ProdutorServices produtorServices;
         try{
            solicitacaoServices = new SolicitacaoServices();
            produtorServices = new ProdutorServices();
            this.solicitacao.setProdutor(produtorServices.procurarProdutor(this.idProdutor));
         }
         ...
     }
}

Na página JSF eu fiz o que vc falou Diego:

<h:selectOneMenu styleClass="dimensao_combo" value="#{SolicitacaoController.idProdutor}">
       <f:selectItems value="#{ProdutorController.produtoresCombo}" />
</h:selectOneMenu>

Seria isso mesmo Diego?

[]'s.

ricardocomp

Essa parte eu já arrumei Diego:

this.produtoresCombo.add(new SelectItem(p.getIdProdutor(), p.getNome()));

:smiley:

Eu não sabia que a primeira parte
do construtor correspondia ao valor
e a segunda ao label.

Eu tô quase conseguindo
aqui Diego.

O Erro já mudou aqui.

[]'s.

D

Isso aí…

bota pra funcionar e posta o resultado…

ricardocomp

Acotenceu o seguinte Diego
caiu no catch:

catch (SolicitacaoServicoException ex) {
            ex.printStackTrace();
            FacesContext.getCurrentInstance().addMessage
            ("", new FacesMessage("Houve um Problema na Solicitação!"));
            return "falha_ins";
}

Eu estou tentando saber pq caiu
no catch.

[]'s.

D

posta o ex.printStacktrace()

ricardocomp

Diego deixa eu te perguntar
eu tenho uma página jsf
para preencher os dados
de uma solicitação e na próxima
página eu tenho uma outra página
para cadastrar amostras de uma
solicitação, ou seja, eu tô
criando uma solicitação com
a lista de amostras vazia
(null), acho que eu teria
que avançar mas o botão
só avançaria para a próxima
página e só quando o usuário
terminasse de preencher tudo
que eu deveria chamar o método
create(), Acho que deve ser
por isso que caiu no catch
Diego.

exception.SolicitacaoServicoException: A solicitação não possui amostra cadastrada!
        at model.services.SolicitacaoServices.salvarSolicitacaoServico(SolicitacaoServices.java:32)
        at controller.SolicitacaoController.create(SolicitacaoController.java:184)

Mas Muito Obrigado mesmo pela a sua ajuda,
se tivesse jeito eu até te pagava uma
BREJA pra gente tomar. :smiley:

e obrigado também a todos
que me ajudaram.

[]'s.

Criado 21 de janeiro de 2010
Ultima resposta 21 de jan. de 2010
Respostas 21
Participantes 4