Erro ao inicializar um valor em um HashMap

13 respostas
C

Estou com um pequeno problema em um HashMap, consegui fazer uma Matriz(Quarto x Dias do mes) até ai tudo bem consigo exibir tranquilo, o problema chega quando tenho que inicializar essa Matriz carregando os dados de uma reserva. Segue o código abaixo

@ManagedBean
@RequestScoped
public class OrcamentoBean {

	private List<Integer> dia = new ArrayList<Integer>();
	private List<Quarto> quarto = new ArrayList<Quarto>();
	private Map<Quarto,Map<String,Reservas>> valores;
	private Calendar cal = Calendar.getInstance();	
	private QuartoBC quartoBC = new QuartoBC();
	private ReservasBC reservasBC = new ReservasBC();
	

	public OrcamentoBean() {
		cal.setTime(new Date());
		cal.set(Calendar.DAY_OF_MONTH, 1);
		int diaPrimeiro = cal.get(Calendar.DAY_OF_WEEK);
		int ultimoDia = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
		for(int i = 1; i <= ultimoDia; ++i){
				dia.add(i);					
		}
		quarto = this.quartoBC.findAll();
		inicializaValores();
		}

	private void inicializaValores() {
		this.valores = new HashMap<Quarto,Map<String,Reservas>>();
		List<Reservas> listaReservas = this.reservasBC.findAll();		
		HashMap<String, Reservas> valorMes = null;
		DataCompare dc = new DataCompare();
		Reservas r = new Reservas();
		for (Quarto cat:this.quarto) {
			cat.getNumero();
			valorMes = new HashMap<String, Reservas>();
			for (Integer mes:this.dia) {
				if((mes >= r.getDiaEntrada().getDay()) && (mes <= r.getDiaSaida().getDay())){
					if(cat.getNumero().equals(r.getIdquarto().getNumero())){
						r.getIdcliente().getPessoaFisica().getPessoa().getNome();
						valorMes.put(mes.toString(), r);
					}
				}
			}
			this.valores.put(cat, valorMes);
		}
	}

	public Map<Quarto, Map<String, Reservas>> getValores() {
		if (this.valores == null) {
			this.inicializaValores();
		}
		return this.valores;
	}
	
	
	public void setValores(Map<Quarto, Map<String, Reservas>> valor) {this.valores = valor;}
	public List<Integer> getDia() {return dia;}
	public void setDia(List<Integer> dia) {this.dia = dia;}
	public List<Quarto> getQuarto() {return quarto;}
	public void setQuarto(List<Quarto> quarto) {this.quarto = quarto;}
	
}

Quando eu entro na página as seguintes linhas me retornam nula

if((mes >= r.getDiaEntrada().getDay()) && (mes <= r.getDiaSaida().getDay())){
					if(cat.getNumero().equals(r.getIdquarto().getNumero())){
						r.getIdcliente().getPessoaFisica().getPessoa().getNome();
						valorMes.put(mes.toString(), r);
					}
				}

A variavel r está vindo nula sempre. Esse hashmap quando inicializar tem que mostrar o nome dos clientes que fizeram uma reserva no quarto e em um certo dia.

13 Respostas

Hebert_Coelho

Talvez não seja o r mas sim o que você está chamando dentro do r.

Por exemplo:

r.getDiaEntrada().getDay()

r.getDiaSaida().getDay()

Os dias estão sendo iniciados ao fazer Reservas r = new Reservas();?

OBS.: Ao invés de r apenas renomeia para reservas fica mais bonitin, e dentro do padrão javabeans. ^^

C

jakefrog:
Talvez não seja o r mas sim o que você está chamando dentro do r.

Por exemplo:

r.getDiaEntrada().getDay()

r.getDiaSaida().getDay()

Os dias estão sendo iniciados ao fazer Reservas r = new Reservas();?

OBS.: Ao invés de r apenas renomeia para reservas fica mais bonitin, e dentro do padrão javabeans. ^^

Sim é o que está dentro do R que está vindo nulo. Não entendi direito a sua pergunta, você está se referindo se o Reservas() puxa os dados do banco? se for essa pergunta quem faz isso pra mim é outra classe.

Creio que o erro seja porque o objeto não está sendo carregado na variavel e por isso não puxa a informação do banco, porém não sei como carregar esse objeto nessa váriavel.

E obrigado pela dica =p

Hebert_Coelho

Mas olhando pelo seu código, você ainda não puxou do código nada.

Olha soh, vc faz o Reservas r = new Reservas(); e 5 linhas abaixo você faz o if dentro da reservas, ou seja, você nem foi ao banco de dados ainda.

C

jakefrog:
Mas olhando pelo seu código, você ainda não puxou do código nada.

Olha soh, vc faz o Reservas r = new Reservas(); e 5 linhas abaixo você faz o if dentro da reservas, ou seja, você nem foi ao banco de dados ainda.

Sim realmente foi um erro meu isso, fiz umas alterações que voltaram a funcionar até certo ponto. Segue as alterações:

private List<Reservas> listaReserva = new ArrayList<Reservas>();

listaReserva = this.reservasBC.findAll(); //Adicionado em OrcamentoBean()

//Mudei o inicializarValores()
private void inicializaValores() {  
        this.valores = new HashMap<Quarto,Map<String,String>>();              
        HashMap<String, String> valorMes = null;
        for (Quarto cat:this.quarto) { 
            valorMes = new HashMap<String, String>();  
            for (Integer mes:this.dia) {  
                for(Reservas res:this.listaReserva){
                    if((mes >= res.getDiaEntrada().getDate()) && (mes <= res.getDiaSaida().getDate())){  
                        if(cat.getNumero().equals(res.getIdquarto().getNumero())){                               
                           valorMes.put(mes.toString(), res.getIdcliente().getPessoaFisica().getPessoa().getNome());  
                        }  
                    }
                }  
            }  
            this.valores.put(cat, valorMes);  
        }  
    }

Ele ta pegando tudo certo, nome do cliente, data de entrada e data de saida da reserva, numero do quarto, só que ele não adiciona na matriz. Segue a página onde mostro a matriz abaixo

<h:body>
	
	<h:form id="orcamento">
		<h:messages />
		<h:dataTable value="#{orcamentoBean.quarto}" var="cat">
			<h:column>
				<f:facet name="header">Quarto</f:facet>
				<h:outputText value="#{cat}" />
			</h:column>
			<c:forEach var="mes" items="#{orcamentoBean.dia}">
				<h:column>
					<f:facet name="header">#{mes}</f:facet>
					
				</h:column>
			</c:forEach>
		</h:dataTable>
		
	</h:form>
Hebert_Coelho

Ao debugar ele chega a entrar no método “.put” dos seus maps?

C

Sim

Hebert_Coelho

Não se o datatable itera sobre map.

Faz um teste, tente coloca a saida como uma lista. Eu imagino que seja esse o problema.

C

jakefrog:
Não se o datatable itera sobre map.

Faz um teste, tente coloca a saida como uma lista. Eu imagino que seja esse o problema.

ACho que não entendi direito, você está falando para alterar o valorMes e valores para um List?

Hebert_Coelho

Isso mesmo. [=

Pelo menos é oq eu vi no Javadoc, posso te olhado errado: http://docs.oracle.com/cd/E17802_01/j2ee/javaee/javaserverfaces/1.2_MR1/docs/api/javax/faces/component/UIData.html#getValue()

C

jakefrog:
Isso mesmo. [=

Pelo menos é oq eu vi no Javadoc, posso te olhado errado: http://docs.oracle.com/cd/E17802_01/j2ee/javaee/javaserverfaces/1.2_MR1/docs/api/javax/faces/component/UIData.html#getValue()

Alterei os valores para uma lista, mas ainda continua sem adicionar o nome do cliente na matriz

private void inicializaValores() {    
        this.valores = new ArrayList<String>();                
        List<String> valorMes = null;  
        for (Quarto cat:this.quarto) {   
            valorMes = new HashMap<String, String>();    
            for (Integer mes:this.dia) {    
                for(Reservas res:this.listaReserva){  
                    if((mes >= res.getDiaEntrada().getDate()) && (mes <= res.getDiaSaida().getDate())){    
                        if(cat.getNumero().equals(res.getIdquarto().getNumero())){                                 
                           valorMes.add(res.getIdcliente().getPessoaFisica().getPessoa().getNome());    
                        }    
                    }  
                }    
            }    
            this.valores.addAll(valorMes);    
        }    
    }
Hebert_Coelho

Agora ele não está exibindo nada na tela?

Existe resultado vindo do banco de dados na hora da consulta?

C

jakefrog:
Agora ele não está exibindo nada na tela?

Existe resultado vindo do banco de dados na hora da consulta?

Ele exibe a Matriz com os quartos e dias do mes mais não adiciona os dados dentro dessa matriz. Sim está vindo dados do banco, fiz esses testes ele consegue pegar tudo certo só que não adiciona o valor na matriz

C

Bom, consegui carregar os dados na matriz, o erro era que faltava apenas um output na pagina ¬¬, unico problema é que ele está adicionando todos os dados em todos os dias segue a página abaixo:

<h:form id="orcamento">
		<h:messages />
		<h:dataTable value="#{orcamentoBean.quarto}" var="cat">
			<h:column>
				<f:facet name="header">Quarto</f:facet>
				<h:outputText value="#{cat}" />
			</h:column>
			<c:forEach var="dia" items="#{orcamentoBean.dia}">
				<h:column>
					<f:facet name="header">#{dia}</f:facet>
					<c:forEach var="res" items="#{orcamentoBean.valores}">
                                              <h:outputText value="#{res}" />
                                        </c:forEach>
				</h:column>
			</c:forEach>
		</h:dataTable>
		<h:commandButton action="#{orcamentoBean.salvar}" value="Salvar" />
	</h:form>

Exemplo tenho 3 reservas no dia 5, 15 e 20 com os clientes Jose, Maria e João ele está adicionando JoseMariaJoao em todos os dias.

Criado 31 de dezembro de 2011
Ultima resposta 1 de jan. de 2012
Respostas 13
Participantes 2