Erro ao inserir um objeto em uma Lista

6 respostas
K

Boa tarde,
Estou tendo um erro quando tento adicionar um registro em um List<Objeto>. O programa le os registros no banco e cria o objeto, mas toda vez que adiciono um novo objeto na lista o sistema altera todos os objetos da lista para o ultimo objeto adicionado. Ou seja, no final da execução, tenho todos os objetos iguais.

Alguem já passou por isso?

import br.com.banco.conex;
import br.com.entidade.Itens;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

/**
 *
 * @author guilherme
 */
@WebService()
public class pegarItens {

    /**
     * Operação de serviço web
     */
    @WebMethod(operationName = "pegarItens")
    public String pegarItens(@WebParam(name = "cod-rep") int codRep) {
        try {
            conex cxEMS2ESP = new conex("EMS2ESP");
            sql = "select pub.\"ext-item\".\"it-codigo\", pub.\"fruki-ext-items\".\"nome-reduzido\", pub.\"ext-item\".\"char-1\" as \"unidades\", " + "pub.\"esp-origem\".\"descricao\" as \"origem\", pub.\"esp-sabor\".\"descricao\" as \"sabor\", pub.\"esp-embalagem\".\"descricao\" as " + "\"embalagem\" from pub.\"ext-item\", pub.\"esp-origem\", pub.\"esp-sabor\", pub.\"fruki-ext-items\", pub.\"esp-embalagem\" where pub.\"ext-item\"." + "\"cod-origem\" = pub.\"esp-origem\".\"cod-origem\" and pub.\"ext-item\".\"cod-sabor\"  = pub.\"esp-sabor\".\"cod-sabor\"  and " + "pub.\"ext-item\".\"it-codigo\"  = pub.\"fruki-ext-items\".\"it-codigo\"  and pub.\"ext-item\".\"cod-embalagem\" = pub.\"esp-embalagem\".\"cod-embalagem\" and pub.\"ext-item\".\"it-codigo\" &lt;= '00011'";
            resultadoItens = cxEMS2ESP.ExecutaSQL(sql);
            
            while (resultadoItens.next()) {
                System.out.println(resultadoItens.getString("it-codigo"));
                Itens itensGerados = new Itens(resultadoItens.getString("it-codigo"));                
                listaItens.add(itensGerados);
            }
            for (Iterator&lt;Itens&gt; it = listaItens.iterator(); it.hasNext();) {
                Itens itens = it.next();
                System.out.println(itens.getItCodigo());
            }
        } catch (SQLException ex) {
            Logger.getLogger(pegarItens.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    private static ResultSet resultadoItens;
    private static List&lt;Itens&gt; listaItens = new ArrayList&lt;Itens&gt;();
    private String sql;
}

Obrigado desde já.

6 Respostas

T

Fala ai, beleza.

Dei 1 olhada no codigo e parece estar ok.

Será que não é o retorno do banco que está igual em todos os registros ? o valor de it-codigo que você está imprimindo dentro do while sai diferente ?

até.

K

Opa,

Cara, na impressão do while sai todos os it-codigos diferentes, já verifiquei o código SQL para ver se tinha alguma coisa e esta tudo certo. Só os valores do List que grava sempre o mesmo, e detalhe, sempre o ultimo registro.

Exemplo.:
Na primeira vez que adiciono o objeto (it-codigo - 00001) no list ele fica assim.
Ele imprime - 00001.
Na segunda vez que adiciono o objeto (it-codigo - 00003) no list ele fica assim.
Ele imprime - 00003.
Ele imprime - 00003.

T

Você pode disponibilizar a classe Itens ?

K

Segue a classe Itens.

public class Itens {

    private static String itCodigo;
    private static String sabor;
    private static String embalagem;
    private static String tipo;
    private static Integer unidades;
    private static String nomeReduzido;
    private static String nome;
    private static String origem;

    public Itens() {
    }

    public Itens(String itCodigo) {
        this.itCodigo = itCodigo;
    }

    public String getEmbalagem() {
        return embalagem;
    }

    public void setEmbalagem(String embalagem) {
        Itens.embalagem = embalagem;
    }

    public String getItCodigo() {
        return itCodigo;
    }

    public void setItCodigo(String itCodigo) {
        Itens.itCodigo = itCodigo;
    }

    public String getNomeReduzido() {
        return nomeReduzido;
    }

    public void setNomeReduzido(String nomeReduzido) {
        Itens.nomeReduzido = nomeReduzido;
    }

    public String getSabor() {
        return sabor;
    }

    public void setSabor(String sabor) {
        Itens.sabor = sabor;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        Itens.tipo = tipo;
    }

    public Integer getUnidades() {
        return unidades;
    }

    public void setUnidades(Integer unidades) {
        Itens.unidades = unidades;
    }

    public String getOrigem() {
        return origem;
    }

    public void setOrigem(String origem) {
        Itens.origem = origem;
    }

    public String getNome() {
        return nome;
    }

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

Opa.

Na sua classe Itens, tira o static, na declaração dos atributos.

Isso vai causar erros nos metodos set´s, é só tirar o nome da classe que irá resolver.

Atualmente:

private static String embalagem; .... public void setEmbalagem(String embalagem) { Itens.embalagem = embalagem; }

Deve ficar assim:

private String embalagem; .... public void setEmbalagem(String embalagem) { embalagem = embalagem; }

Como o atributo está definido como statico, ele não vai ser criado toda hora que você instanciar a classe, por isso todos os elementos da sua lista estão com o valor da “ultima atribuição”.

pmlm

Errado. Deve ficar

public void setEmbalagem(String embalagem) {  
       this.embalagem = embalagem;  
    }
Criado 22 de março de 2011
Ultima resposta 22 de mar. de 2011
Respostas 6
Participantes 3