Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Erro : Don't know how to iterate over supplied "items"

Boa noite estou com um erro na hora de iterar meu carrinhoItem, pelo oq pesquisei esse erro é relacionado a quando vc quer itera uma lista mas nao estou fazerndo isso.

o meu form de envio para o Controller do CarrinhoItem fica em uma jsp de categorias, ou seja, na minha pagina principal, tenho botões que enviam um inputcom o valor da pesquisa da categoria e faço a busca no banco, esse retorno de metodo é uma lista talves seja isso,

segue meu form:

<form action="/rprvidros/carrinho/add" method="post">
            <div class="container">
                <c:forEach items="${produto}" var="produto">
                    <div class="produtos-categoria">
                        <img src="${produto.path }">
                        <p class="produto-titulo">${produto.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="${produto.id}" />
                        <input type="hidden" name="${_csrf.parameterName }" value="${_csrf.token }" />
                    </div>
                </c:forEach>
            </div>
        </form>

meu Controller:

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

    @Autowired
    private ProdutoDao dao;

    @RequestMapping("/add")
    public ModelAndView add(Integer produtoId) {
        ModelAndView modelAndView = new ModelAndView("detalhe");
        PedidoItem criaItem = criaItem(produtoId);
        modelAndView.addObject("produto", criaItem);
        return modelAndView;

    }

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

}

meu metodo find:

public Produtos find(Integer id){
        return (Produtos) manager.createQuery("select p from Produtos p where p.id = " + id).getSingleResult();
    }

minha classe PedidoItem:

@Entity
@Component
public class PedidoItem {



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


    public Produtos getProduto() {
        return produto;
    }

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


    @Id
    private Integer id;

    @OneToOne
    private 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;
    }

e minha jsp de detalhe:

<c:forEach items="${produto}" var="produto">
                    <div class="produtos-categoria">
                        <img src="${item.path }">
                        <p class="produto-titulo">${produto.descricao}</p>
                        <p class="preco-produto">R$ ${produto.preco}</p>
                        <p class="produto-carrinho">
                    </div>
                </c:forEach>

muito obrigado.

5 respostas

Gabriel, vi que você utiliza isso em suas views:

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

Esta tag forEach representa a iteração em uma lista. Você não precisa utilizá-la se não tiver uma lista na qual iterar.

Removê-las e deixar somente o conteúdo interno a elas deve resolver seu problema.

Marcos, mas se eu tiver mas de 1 carrinhoItem eu preciso de Lista correto?

solução!

Correto! Porém, para poder utilizar o forEach você precisa ter uma lista passada pelo controller.

PedidoItem item1;
PedidoItem item2;
Lista<PedidoItem> itens = new ArrayList<>();
itens.add(item1);
itens.add(item2);
modelAndView.addObject("produtos", itens);
<c:forEach items="${produtos}" var="produto">
${produto.id}
</c:forEach>

Marcos bom dia, desculpe pela demora, mas mesmo com essas alterações ele continua com o erro estou passando um ArrayList<PedidoItem> pelo meu controller para minha view, e ele da o mesmo erro.

Marcos consegui resolver obrigado.