Solucionado (ver solução)
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?