Como utilizar o método "add" do List? (VRaptor + Low-Level API + Objectify) [RESOLVIDO]

2 respostas
MABS

Bom dia!

Estou tentando realizar um loop (forEach) que pega a informação no banco de dados (BigTable) um a um de uma determinada Entidade e guarda em uma lista (List), até este momento acho que esta tudo OK, mas, infelizmente de alguma forma a lista fica só com o valor da última propriedade que esta na Entidade, sendo que, o quantidade de itens na lista e exatamente a quantidade que tem na Entidade com o mesmo valor duplicado do último item que foi pego pelo loop.

Segue abaixo todas as classes e JSP's que estou utilizando.
[color=red]formBuscaPorNome:[/color]

<form id=formBuscaPorNome action="<c:url value="/equipamento/exibirDbNome" />" method="get">
	<fieldset>
		<legend>Busca Equipamento</legend>
		
		<label for="nome">Nome:</label>
		<input id="nome" type="text" name="equipamento.nome" value="${equipamento.nome}" />
		
		<c:forEach items="${errors}" var="error">
			<c:if test="${error.category == 'equipamento.nome'}"></c:if>
				<br/>
				<font size="2" color="red">${error.message}</font>
		</c:forEach>
		
		<button type="submit">Buscar</button>
	</fieldset>
</form>

[color=red]EquipamentoController:[/color]

@Resource
public class EquipamentoController {

	private final EquipamentoDao daoEquipamento;
	private final AgregacaoEquipamentoDao daoAgregacaoEquipamento;
	private final MarcaEquipamentoDao daoMarcaEquipamento;
	private final NomeEquipamentoDao daoNomeEquipamento;
	private final ClassificacaoEquipamentoDao daoClassificacaoEquipamento;
	private final SetorEquipamentoDao daoSetorEquipamento;
	private final EquipamentoNomeDao daoEquipamentoNome;

	private final Result result;
	private final Validator validator;

	public EquipamentoController(EquipamentoDao daoEquipamento,
			AgregacaoEquipamentoDao daoAgregacaoEquipamento,
			MarcaEquipamentoDao daoMarcaEquipamento,
			NomeEquipamentoDao daoNomeEquipamento,
			ClassificacaoEquipamentoDao daoClassificacaoEquipamento,
			SetorEquipamentoDao daoSetorEquipamento,
			EquipamentoNomeDao daoEquipamentoNome,
			Result result, Validator validator) {
		this.daoEquipamento = daoEquipamento;
		this.daoAgregacaoEquipamento = daoAgregacaoEquipamento;
		this.daoMarcaEquipamento = daoMarcaEquipamento;
		this.daoNomeEquipamento = daoNomeEquipamento;
		this.daoClassificacaoEquipamento = daoClassificacaoEquipamento;
		this.daoSetorEquipamento = daoSetorEquipamento;
		this.daoEquipamentoNome = daoEquipamentoNome;
		this.result = result;
		this.validator = validator;
	}

        @Get
	@Path("/equipamentos/buscaPorNome")
	public void formBuscaPorNome() {
	}

        @Get
	@Path("/equipamento/exibirDbNome")
	public List<Equipamento> exibirRealizandoBuscaBancoDeDadosPorNome (Equipamento equipamento) {
		List<Equipamento> equipamentos = this.daoEquipamentoNome.buscar(equipamento);
		System.out.println("Controller Primerito Equipamento: " + equipamentos.get(0).getNumeroSavitecPadronizadoENG());
		System.out.println("Controller Segundo Equipamento: " + equipamentos.get(1).getNumeroSavitecPadronizadoENG());
		return equipamentos;
	}
}

[color=red]EquipamentoNomeDao:[/color]

@Component
public class EquipamentoNomeDao {

	private DatastoreService datastore;
	private final AgregacaoEquipamentoNomeDao dao;

	public EquipamentoNomeDao(AgregacaoEquipamentoNomeDao dao) {
		this.datastore = DatastoreServiceFactory.getDatastoreService();
		this.dao = dao;
	}

	public void salvar(Equipamento equipamento) {
		Entity entidade = new Entity("Equipamento" + equipamento.getNome().replaceAll(" ", ""), this.dao.pegaIdESomaMaisUm());
		
		entidade.setProperty("nome", equipamento.getNome());
		entidade.setProperty("patrimonio", equipamento.getPatrimonio());
		entidade.setProperty("serie", equipamento.getSerie());
		entidade.setProperty("numeroSavitec", equipamento.getNumeroSavitec());
		entidade.setProperty("marca", equipamento.getMarca());
		entidade.setProperty("modelo", equipamento.getModelo());
		entidade.setProperty("setor", equipamento.getSetor());
		entidade.setProperty("classificacao", equipamento.getClassificacao());
		
		this.datastore.put(entidade);
	}

	public List<Equipamento> buscar(Equipamento equipamento) {
		Entity entidade = null;
		List<Equipamento> equipamentos = new ArrayList<Equipamento>();
		Long total = this.dao.pegaValorDoCounterDeId();
		
		for (Long counter = 1L; counter <= total; counter++) {
			
			try {
				entidade = this.datastore.get(KeyFactory.createKey("Equipamento" + equipamento.getNome().replaceAll(" ", ""), counter));
			} catch (EntityNotFoundException e) {
				System.out.println("Entidade '" + equipamento.getNome() + "'não existe!");
				System.out.println("Valor da Entidade quando der erro: " + entidade);
			}
			
			equipamento.setPatrimonio((String) entidade.getProperty("patrimonio"));
			equipamento.setSerie((String) entidade.getProperty("serie"));
			equipamento.setNumeroSavitec((Long) entidade.getProperty("numeroSavitec"));
			equipamento.setNome((String) entidade.getProperty("nome"));
			equipamento.setMarca((String) entidade.getProperty("marca"));
			equipamento.setModelo((String) entidade.getProperty("modelo"));
			equipamento.setSetor((String) entidade.getProperty("setor"));
			equipamento.setClassificacao((String) entidade.getProperty("classificacao"));
			
			System.out.println("Valor da Variavel 'equipamento': " + equipamento.getNumeroSavitecPadronizadoENG());
			
			equipamentos.add(equipamento);
			
			System.out.println("Primeiro Equipameto: " + equipamentos.get((int) (counter - 1L)).getNumeroSavitecPadronizadoENG());
			
			System.out.println("Patrimonio: " + entidade.getProperty("patrimonio"));
			System.out.println("Serie: " + entidade.getProperty("serie"));
			System.out.println("Numero Savitec: " + entidade.getProperty("numeroSavitec"));
			System.out.println("Nome: " + entidade.getProperty("nome"));
			System.out.println("Marca: " + entidade.getProperty("marca"));
			System.out.println("Modelo: " + entidade.getProperty("modelo"));
			System.out.println("Setor: " + entidade.getProperty("setor"));
			System.out.println("Classificação: " + entidade.getProperty("classificacao"));
			
			System.out.println("------------------------------------------------------------------------------------------------");
				
		}
		
		System.out.println("Fora do For no Dao: " + equipamentos.get(0).getNumeroSavitecPadronizadoENG());
		System.out.println("Fora do For no Dao: " + equipamentos.get(1).getNumeroSavitecPadronizadoENG());
		
		return equipamentos;
	}
	
}

[color=red]exibirRealizandoBuscaBancoDeDadosPorNome:[/color]

<table>
	<thead>
		<tr>
			<th>Numero Savitec</th>
			<th>Patrimonio</th>
			<th>Serie</th>
			<th>Nome</th>
			<th>Marca</th>
			<th>Modelo</th>
			<th>Classificação</th>
			<th>Setor</th>
		</tr>
	</thead>
	<tbody>
		<c:forEach items="${equipamentoList}" var="equipamento">
			<tr>
				<td>${equipamento.numeroSavitecPadronizadoENG}</td>
				<td>${equipamento.patrimonio}</td>
				<td>${equipamento.serie}</td>
				<td>${equipamento.nome}</td>
				<td>${equipamento.marca}</td>
				<td>${equipamento.modelo}</td>
				<td>${equipamento.classificacao}</td>
				<td>${equipamento.setor}</td>
			</tr>
		</c:forEach>
	</tbody>
</table>

O resultado dessa brincadeira no Eclipse fica da seguinte forma:

Valor da Variavel 'equipamento': ENG-0009
Primeiro Equipameto: ENG-0009
Patrimonio: 012211
Serie: 102010
Numero Savitec: 9
Nome: Ventilador Pulmonar
Marca: Nada
Modelo:
Setor: UTI
Classificação: Risco II
------------------------------------------------------------------------------------------------
Valor da Variavel 'equipamento': ENG-0010
Primeiro Equipameto: ENG-0010
Patrimonio: 81601
Serie: 9619806
Numero Savitec: 10
Nome: Ventilador Pulmonar
Marca: Nada
Modelo:
Setor: UTI
Classificação: Risco II
------------------------------------------------------------------------------------------------
Valor da Variavel 'equipamento': ENG-0011
Primeiro Equipameto: ENG-0011
Patrimonio: 78190817
Serie: [telefone removido]
Numero Savitec: 11
Nome: Ventilador Pulmonar
Marca: Philips
Modelo:
Setor: UTI
Classificação: Risco IV
------------------------------------------------------------------------------------------------
Fora do For no Dao: ENG-0011
Fora do For no Dao: ENG-0011
Controller Primerito Equipamento: ENG-0011
Controller Segundo Equipamento: ENG-0011

O processo realizado no navegador fica da seguinte forma:

Primeiro realizo a busca por nome do Equipamento "Ventilador Pulmonar":
[color=red]Visualize o Anexo "Realizando Busca".[/color]

O resultado da busca vem com a quantidade de itens corretos mas apenas com o valor do último item duplicado pela quantidade correta:
[color=red]Visualize o Anexo "Resultado da Busca".[/color]

Estou sem idéias para solucionar este problema, se alguém tiver alguma luz, por favor, me ajude.

Sucesso!
Abraço!



2 Respostas

MichelSante

Opa beleza?

No seu objeto EquipamentoNomeDao o metodo public List<Equipamento> buscar(Equipamento equipamento) {…} experimente instanciar um novo objeto para cada add que fizer na lista de retorno.

Ex:

Equipamento  equip = new Equipamento(); 

equip.setPatrimonio((String) entidade.getProperty("patrimonio"));   
equip.setSerie((String) entidade.getProperty("serie"));   
equip.setNumeroSavitec((Long) entidade.getProperty("numeroSavitec"));   
equip.setNome((String) entidade.getProperty("nome"));   
equip.setMarca((String) entidade.getProperty("marca"));   
equip.setModelo((String) entidade.getProperty("modelo"));   
equip.setSetor((String) entidade.getProperty("setor"));   
equip.setClassificacao((String) entidade.getProperty("classificacao"));   
              
equipamentos.add(equip);
MABS

Olá MichelSante!

É este realmente o problema eu estava fazendo referência para o mesmo objeto na memória, muito obrigado pela ajuda!
O Mauricio Aniche me passou a mesma solução pelo GTalk!

Agradeço a ajuda dos dois!

Sucesso!
Abraço!

Criado 7 de julho de 2011
Ultima resposta 7 de jul. de 2011
Respostas 2
Participantes 2