Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
11
respostas

Erro ao criar carrinhoItem ERRO: id to load is required for loading

Boa tarde.

estou fazendo o envio do ProdutoId para o controller fazer a criação do carrinhoItem mas me é retornado esse erro.

Form de envio:

<form:form action="${s:mvcUrl('CCC#add').build()}" method="post">
            <div class="container">
                <c:forEach items="${produto}" var="produtos">
                    <div class="produtos-categoria">
                        <img src="${produtos.path }">
                        <p class="produto-titulo">${produtos.descricao}</p>
                        <p class="preco-produto">R$</p>
                        <p class="produto-carrinho">
                        <button type="submit" class="botao-carrinho">
                        <span class="icon-shopping-cart"> </span>
                        Adicionar ao Carrinho </button></p>
                        <input type="hidden" name="produtoId" value="${produtos.id}"/>
                    </div>
                </c:forEach>
            </div>
        </form:form>

meu Controller:

package br.com.rprvidros.controllers;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import br.com.rprvidros.daos.PedidoItemDao;
import br.com.rprvidros.daos.ProdutoDao;
import br.com.rprvidros.models.Pedido;
import br.com.rprvidros.models.PedidoItem;
import br.com.rprvidros.models.Produtos;
import br.com.rprvidros.models.Usuario;

@Controller
@RequestMapping("/carrinho")
public class CarrinhoComprasController {

    @Autowired
    private ProdutoDao dao;



    @RequestMapping("/add")
    public ModelAndView add(Integer produtoId) {
        ModelAndView modelAndView = new ModelAndView("redirect:/rprvidros");
        PedidoItem criaItem = criaItem(produtoId);
        modelAndView.addObject("item", criaItem);
        return modelAndView;

    }

    private PedidoItem criaItem(Integer produtoId) {
        Produtos produto = dao.find(produtoId);
        PedidoItem pedidoItem = new PedidoItem(produto);
        return pedidoItem;
    }

}

pelo erro meu ìd está sendo enviado null mas pelo menos quando a pagina é carregada eu adicionei a linha :

<p class="produto-id">${produtos.id}</p> e é exibido na tela normalmente o ìd do produto, então pelo menos na hora de exibição esta sendo carregado.

obrigado.

11 respostas

Olá,

Nesta linha:

<input type="hidden" name="produtoId" value="${produtos.id}"/>

Não deveria ser:

<input type="hidden" name="produtoId" value="${produto.id}"/>

Té mais,

Eae Fagner beleza?

então cara acredito que não pois eu declaro o nome da variavel como produtos nesta linha:

<c:forEach items="${produto}" var="produtos">

seu eu coloco da sua forma minha jsp quebra.

Caramba, agora que reparei que troquei os dados. O spring tem uma tag de hidden:

<form:hidden path="secretValue" />

Té mais.

Fagner funcionou obrigado mas agora estou com erro.

hahahah.

Acontece, posso ajudar?

Té mais,

Se vc puder agradeço muito kk

é o seguinte to tentando adicionar uma List de produtos em meu carrinhoItem, faço a pesquisa pelo id, que vc me ajudou a resolver, so que agora ele me retorna esse erro:

br.com.rprvidros.models.Produtos cannot be cast to java.util.List

ou seja ele nao esta conseguindo fazer o cast de Produtos

minha classe de PedidoItem :

package br.com.rprvidros.models;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import org.springframework.stereotype.Component;

@Entity
@Component
public class PedidoItem {


    public PedidoItem(Produtos produto) {
        this.produto = (List<Produtos>) produto;
    }

    public List<Produtos> getProduto() {
        return produto;
    }

    public void setProduto(List<Produtos> produto) {
        this.produto = produto;
    }

    @Id
    private Integer id;

    @OneToMany(mappedBy = "id", targetEntity = Produtos.class)
    private List<Produtos> produto;

    @ManyToOne
    @JoinColumn(name = "pedido_id")
    private Pedido pedido;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Pedido getPedido() {
        return pedido;
    }

    public void setPedido(Pedido pedido) {
        this.pedido = pedido;
    }

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

}

Pelo jeito o erro é no construtor

Perceba que são classes diferentes. Logo o cast vai falhar.

Té mais,

Cara sinceramente não entendi, pq meu construtor eu recebo um produto pra criar um pedido item, na chamada do metodo eu passo o produto, como são classes diferentes?

E como está a invocação do construtor?

solução!

Perceba que Produtos é diferente de List.

o chamada esta assim: PedidoItem pedidoItem = new PedidoItem(produto); mas não seria uma List de produtos?