1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Erro ao mostrar objeto do ArrayList em jsf

Quando clico em detalhes dos artigos listados, ele chama a view Detalhes mas aparece sempre o ultimo Artigo da lista, criada no construtor da Classe gerenciadorBean. Ou seja, qualquer objeto que clicar nessa lista, vai aparecer somente o ultimo registro da lista?

//SuperClasse:

package util;

public class Artigo {
    private int codigo;
    private String nome;

    public Artigo(){}

    public Artigo(int cod, String name){
            this.codigo = cod;
            this.nome = name;

    }    

    public int getCodigo() {
        return codigo;
    }
    public void setCodigo(int id) {
        this.codigo = id;
    }
    public String getNome() {
        return nome;
    }

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

    @Override
    public String toString() {
        return getNome();
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + codigo;
        result = prime * result + ((nome == null) ? 0 : nome.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;
        Artigo other = (Artigo) obj;
        if (codigo != other.codigo)
            return false;
        if (nome == null) {
            if (other.nome != null)
                return false;
        } else if (!nome.equals(other.nome))
            return false;
        return true;
    }

}

//Subclasse

package util;

public class Carro extends Artigo {

    private int ano;
    private String marca, modelo;

    public Carro(){}

    public Carro(int cod, String nome, String marca, String modelo, int ano) {
        super(cod, nome);
        this.marca = marca;
        this.modelo = modelo;
        this.ano = ano;

    }

    public int getAno() {
        return ano;
    }

    public void setAno(int ano) {
        this.ano = ano;
    }

    public String getMarca() {
        return marca;
    }

    public void setMarca(String marca) {
        this.marca = marca;
    }

    public String getModelo() {
        return modelo;
    }

    public void setModelo(String modelo) {
        this.modelo = modelo;
    }


}

//subclasse

package util;

public class Alimento extends Artigo {

    private String descricao, nomefornecedor;

    public Alimento(){}

    public Alimento(int codigo, String nome, String descricao, String nomeFornecedor) {
        super(codigo, nome);
        this.descricao = descricao;
        this.nomefornecedor = nomeFornecedor;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public String getFornecedor() {
        return nomefornecedor;
    }

    public void setFornecedor(String nomefornecedor) {
        this.nomefornecedor = nomefornecedor;
    }

}

//Classe Bean

@ManagedBean(name = "gerenciadorBean")
@RequestScoped
// define uma sessão
public class GerenciadorBean {

      private ArrayList<Artigo> artigos;
      private Artigo artigo;

      //esse object foi criado para get e mostrar o detalhe o objeto em questão na view detalhe
      private String object;

      //construtor
      public GerenciadorBean() {
            setArtigos(new ArrayList<>());

            // lista de carros do tipo Artigo
            artigos.add(new Carro(1, "Fiesta", "Ford", "FiestaHatch", 2001));
            artigos.add(new Carro(2, "FordKa", "Ford", "FordKaBásico", 2008));

            // lista de alimento do tipo artigo
            artigos.add(new Alimento(3, "Feijão", "Bom gosto", "FeijãoTata ltda"));
            artigos.add(new Alimento(4, "Arroz", "Urbano", "Urbano Ltda"));

      }

      //chama a a view detalhe.xhtml
      public String showDetalhes() {
            return "detalhe.xhtml";
      }

      public Artigo getArtigo() {
            return artigo;
      }

      public void setArtigo(Artigo artigo) {
            this.artigo = artigo;
      }

      public void setArtigos(List<Artigo> artigos) {
            this.artigos = (ArrayList<Artigo>) artigos;
      }

      // vai retornar todos os artigos
      public List<Artigo> getArtigos() {
            return artigos;
      }

      //busca o objeto especifico da SuperClasse fazendo o Cast
      public String getbuscaObjeto() {
            //chama o método abaixo, para fazer o instanceOf do objeto
            object = castObject();
            return object;


      }

      //método que realize o instanceOf
      private String castObject() {
            String artigoObject = "";
            for (Artigo a : artigos) {
                  if (a instanceof Alimento) {
                        Alimento f = (Alimento) a;
                        artigoObject = "Códido: " + f.getCodigo() + "\nNome: "
                                   + f.getNome() + "\nDescrição: " + f.getDescricao()
                                   + "\nFornecedor: " + f.getFornecedor();
                  }

                  if (a instanceof Carro) {
                        Carro c = (Carro) a;
                        artigoObject = "Códido: " + c.getCodigo() + "\nNome: "
                                   + c.getNome() + "\nMarca: " + c.getMarca()
                                   + "\nModelo: " + c.getModelo() + "\nAno: " + c.getAno();
                  }
            }
            return artigoObject;

      }
<crases><!--VIEW listarArtigos.xhtml-->
<!DOCTYPE html>

<html xmlns:ui="http://java.sun.com/jsf/facelets"
     xmlns:h="http://java.sun.com/jsf/html"
     xmlns:f="http://java.sun.com/jsf/core">

<h:head>
     <meta charset="UTF-8" />
     <title>Lista Artigos</title>
</h:head>

<h:body>
          <h:form>
                     <div class="container">
                          <h:dataTable styleClass="table table-striped" var="artigo"
                               value="#{gerenciadorBean.artigos}">

                               <h:column>
                                     <f:facet name="header">Codigo</f:facet>
                                     #{artigo.codigo}
                               </h:column>

                               <h:column>
                                     <f:facet name="header">Nome</f:facet>
                                     #{artigo.nome}
                               </h:column>

                               <h:column>

                               <h:commandButton action="#{gerenciadorBean.showDetalhes}" value="Detalhes"/>

                               </h:column>

                          </h:dataTable>
                     </div> 
               </h:form>
</h:body>

</html>
<!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:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core">

    <h:head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Lista Detalhes</title>
    </h:head>

    <h:body>
        <h:form>
            <h:outputText value="#{gerenciadorBean.buscaObjeto}"/>

        </h:form>
    </h:body>
</html>
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags arraylist ou faça a sua própria pergunta.