Problema ao inserir Item em um Array de Itens

4 respostas
Diego_Adriano

Bom galera, o problema que tenho é o seguinte, estou implementando a parte de vendas da minha aplicação, então disponibilizo ao cliente um um dataTable com os produtos onde ele seleciona o Item e eu exibo em outro dataTable com todos os Itens que ele selecionou .
Bem, inserir o item eu consigo, o problema é no momento de inserir o 2º Item, o JSF esta criando um novo ArrayList ao inves de inserir no que já existe, dessa forma só consigo inserir 1 Item.
bem vou postar meu Bean:

@ManagedBean
@SessionScoped
public class VendaBean implements Serializable{

	private EntityManager entityManager;
	private Cliente clienteSelecionado;
	private Produto produtoSelecionado;
	private Plano   planoSelecionado;
	private Funcionario funcionario;
	private Venda venda;
	private ItensVenda itemVenda;
	private List<ItensVenda> itensVenda = new ArrayList<ItensVenda>();
	
	
	public void adicionaProduto(Produto produto){
		System.out.println("ADD PRODUTO");
		System.out.println("Size A: " +itensVenda.size());//EXIBO QTOS ITEM TEM NA LISTA
		if (itensVenda.isEmpty()){
			itensVenda.add(new ItensVenda(produto));
			FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("itensVenda", itensVenda);	
		}
		else{//NÃO ESTA CHEGANDO NO ELSE
			FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(itensVenda);
			itensVenda.add(new ItensVenda(produto));
			FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("itensVenda", itensVenda);
			System.out.println("Size D: " +itensVenda.size());
		}
			
	}
	/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
	/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
	/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
	
	
	public Produto getProdutoSelecionado() {
		return produtoSelecionado;
	}
	public void setProdutoSelecionado(Produto produtoSelecionado) {
		this.produtoSelecionado = produtoSelecionado;
		System.out.println("SET PRODUTO SELECIONADO: "+ produtoSelecionado.getDescricao());
		adicionaProduto(produtoSelecionado);//CHAMO O MÉTODO QUE INSERE O PRODUTO NA LISTAGEM
Entity Itens
@Entity
public class ItensVenda implements Serializable{
	
	@Id @GeneratedValue(strategy=GenerationType.AUTO)
	private Long id;
	@NotNull
	private Double quantidade;
	@NotNull
	private Double valorUnit;
	@NotNull
	private Double valorTotalItem;
	
	private Double porcDesc;
	
	private Double valorDesc;
	
	@JoinColumn(name="produto_id")
	@ManyToOne
	private Produto produto;
	@JoinColumn(name="plano_id")
	@ManyToOne
	private Plano plano;
	
	public ItensVenda(Produto produto){
		this.produto = produto;
	}

4 Respostas

drsmachado

Camarada, por que esse if/else?
Voce acaba fazendo a mesma coisa para ambos.

**se o arraylista está vazio, adiciona um item
if (itensVenda.isEmpty()){   
            itensVenda.add(new ItensVenda(produto));   
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("itensVenda", itensVenda);     
        }   
        else{//NÃO ESTA CHEGANDO NO ELSE   
		//senão, pega ele no contexto, mas não faz nada com ele, tá certo isso?
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(itensVenda);   
			//adiciona um novo item, como no if
            itensVenda.add(new ItensVenda(produto));   
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("itensVenda", itensVenda);   
            System.out.println("Size D: " +itensVenda.size());   
        }

E você ainda espera que funcione?
Tem certeza que não esqueceu de atribuir um valor a uma certa List?

Diego_Adriano

eu faço o if pq se a lista ainda não foi carregada ela ainda não esta na session … tb n sei se é a forma correta de se fazer …
Se eu ainda espero que funcione ? É impressão minha ou vc esta sendo irônico !!! bem, se eu postei aqui é pq estou com dificuldades pra fazer isso funcionar, então se vc conhece o assunto e sabe como me ajudar agradeço, porém se for pra ironizar a minha dificuldade prefiro que nem comente o tópico …
Obrigado

drsmachado

Diego Adriano:
eu faço o if pq se a lista ainda não foi carrega ela ainda não esta na session … tb n sei se é a forma correta de se fazer …
Se eu ainda espero que funcione ? É impressão minha ou vc esta sendo irônico !!! bem, se eu postei aqui é pq estou com dificuldades pra fazer isso funcionar, então se vc conhece o assunto e sabe como me ajudar agradeço, porém se for pra ironizar a minha dificuldade prefiro que nem comente o tópico …
Obrigado

Sim, eu sou irônico.
Perceba que você tem uma annotation @SessionScoped, isso significa algo para você? Se não, eu digo, isso indica que o ManagedBean em questão e, portanto, todos os seus atributos, estão na sessão.
Se você possui getter e setter do atributo itensVenda, pode utilizá-lo na jsp/html através de EL

<h:dataTable value="#{vendaBean.itensVenda}" var="itensvenda">

Porém, eu utilizaria aí um DataModel itensDM, implementando a classe ListDataModel, recebendo como parâmetro a própria lista itensVenda.

Isso, a princípio, deve eliminar a necessidade de fazer o if/else.

Só uma dica, bom quando sou irônico não quero desmerecer o conhecimento de ninguém, apenas fazer com que pense de outra forma.

Diego_Adriano

Bem, meu bean é de session por isso imaginei que precisava setar a list na sessão ... então por esse motivo pensei em usar o if para colocar a list na sessão somente quando estivesse preenchida ..
Sim eu uso get/set .. apenas não postei a estrutura toda da classe ..
Uso JSF2, vou postar o xHtml:

Litagem dos Produtos a serem selecionados
<!-- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -->
															<!-- LISTAGEM PRODUTO -->
				<!-- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -->
		<p:dialog id="JanelaProduto" widgetVar="janelaProduto" width="1024" 
				  position="center" modal="true" closeOnEscape="true"
				  minWidth="600" >
						
 				<h:form id="tabelaProduto">
 					<p:outputPanel id="Painel" >	
 						<p:dataTable paginator="true"
								 paginatorPosition="bottom"
								 rows="20"
								 value="#{produtoBean.produtos}"
								 var="produto"
								 emptyMessage="Nenhum Produto Cadastrado !"
								 update="dadosProduto,dadosProduto2">
				
						<p:column headerText="ID" style="text-align:center" filterBy="#{produto.id}" sortBy="#{produto.id}">
								<h:outputText value="#{produto.id}"/>
						</p:column>
		
						<p:column headerText="DESCRIÃ?Ã?O" sortBy="#{produto.descricao}" filterBy="#{produto.descricao}">
							<h:outputText value="#{produto.descricao}"/>
						</p:column>	
									
						<p:column style="text-aling:center">
							<f:facet name="header">
								<h:outputText value="#"/>
							</f:facet>
							<p:commandButton update="dados_Produto" ajax="false" oncomplete="janelaProduto.hide()"
											 image="ui-icon-circle-check">
								 <f:setPropertyActionListener target="#{vendaBean.produtoSelecionado}" value="#{produto}"/>
							</p:commandButton>
											
						</p:column>
							
					</p:dataTable>
						
		  		</p:outputPanel>
			</h:form>
  					
</p:dialog>

Listagem dos que foram selecionados

<p:dataTable id="dados_Produto"  
										 paginator="true"
										 paginatorPosition="bottom"
										 rows="10"
										 value="#{vendaBean.itensVenda}"
										 var="venda"
										 emptyMessage="Nenhuma Venda Efetuada !">
																					
												
										<p:column headerText="Cód." style="width:30px;">
											<h:outputText value="#{venda.produto.id}"/>
										</p:column>
													
										<p:column headerText="Descrição">
											<h:outputText value="#{venda.produto.descricao}"/>
										</p:column>
													
										<p:column headerText="U.M" style="width:30px;">
											<h:outputText value="#{venda.produto.unidade_medida}"/>
										</p:column>
										
										<p:column headerText="Qtd">
											<p:inputText size="5"/>
										</p:column>
													
									</p:dataTable>
Criado 6 de outubro de 2011
Ultima resposta 6 de out. de 2011
Respostas 4
Participantes 2