5
respostas

Erro acessando o detalhe do produto. Preço não é exibido.

Olá,

Não estou entendendo porque quando clico no detalhe do produto, a página de detalhe exibe erro ao tentar exibir os preços.

O que pode estar acontecendo?

LISTA DE PRODUTOS

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <h1>Lista de Produtos</h1>

    <div>${sucesso}</div>

    <table>
        <tr>
            <td>ID</td>
            <td>Titulo</td>
            <td>Descrição</td>
            <td>Página</td>
        </tr>

        <c:forEach items="${produtos}" var="produto">
            <tr>
                <td>${produto.id}</td>
                <td><a href="${s:mvcUrl('PC#detalhe').arg(0,produto.id).build()}">${produto.titulo}</a></td>
                <td>${produto.descricao}</td>
                <td>${produto.paginas}</td>
            </tr>
        </c:forEach>
    </table>

</body>
</html>

Detalhe do Produto - detalhe.jsp

<section class="buy-options clearfix">  
      <form action="/carrinho/add" method="post" class="container">
        <ul id="variants" class="clearfix">
            <input type="hidden" value="${produto.id}" name="produtoId">


            <c:forEach items="${produto.precos}" var="preco">
              <li class="buy-option">

                <input type="radio" name="tipo" class="variant-radio" id="tipo"  value="${preco.tipo}" checked="checked"  />

                <label  class="variant-label"> ${preco.tipo} </label>

                <small class="compare-at-price">R$ 39,90</small>
                <p class="variant-price">${preco.valor}</p>
              </li>      
           </c:forEach> 
        </ul>  

       <%--   --%>
        <button type="submit" class="submit-image icon-basket-alt" alt="Compre Agora" title="Compre Agora '${produto.titulo}'"></button>

      </form>

    </section>

Método detalhe do CONTROLLER

@RequestMapping("/detalhe/{id}")
    public ModelAndView detalhe(@PathVariable("id") Integer id) {

        ModelAndView modelAndView = new ModelAndView("produtos/detalhe");
        Produto produto = produtoDAO.find(id);
        String contexto = fileSaver.contexto();

        modelAndView.addObject("produto", produto);
        modelAndView.addObject("contextPath", contexto + "/");

        return modelAndView;
    }

Método find() do produtoDAO

    public Produto find(Integer id) {
        // TODO Auto-generated method stub
        return manager.createQuery("select distinct(p) from Produto p " 
                + "join fetch p.precos where p.id = :id", Produto.class)
                .setParameter("id", id)
                .getSingleResult();
    }
5 respostas

Fala Daniel, tudo bem ?

Qual o erro que você está enfrentando ? Não consegui ver o problema no código.

Olá Rafael.

Me desculpe, esqueci de incluir o ERRO.

Veja:

HTTP Status 500 - org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.casadocodigo.loja.models.Produto.precos, could not initialize proxy - no Session

Opa Daniel ..

Então, esse lazy que está sendo gerado provavelmente ocorre na hora que sua JSP tenta consumir o produto, mais precisamente quando tenta iterar sua lista de preços. Aparentemente sua query não está trazendo os preços do produto e o sistema tenta buscar na hora os dados restantes.

O estranho é que sua query (método find()) já está planejando o join fetch necessário pra garantir os dados dos preços.

Dê uma olhada pra conferir como está vindo sua query, de uma olhada nos logs do hibernate .. tente executar a query direto no banco pra ver o resultado.

Abraço!

Olá amigo.

Já verifiquei tudo e não estou entendendo.

A query está exatamente igual a do curso.

Por favor... poderia disponibilizar os arquivos do curso para que eu possa comparar com os meus.?? Pois estou perdendo muito tempo neste ponto tentando resolver esse erro.

Fala Daniel, tudo bem ?

Desculpa pela demora na resposta. Seguem os links para o repo dos cursos:

https://github.com/alura-cursos/spring-mvc-i-criando-aplicacoes-web-master

https://github.com/alura-cursos/springmvc-2-integracao-cache-seguranca-e-templates

Abraço!