5
respostas

Aula 4 - O comportamento Lazy e OpenEntityManagerInView - Problemas em fazer o que está no vídeo 1

No vídeo 1 o instrutor clica no Editar de um dos livros da página da loja e aparece uma mensagem de erro de org.hibernate.LazyInitializationException no Tomcat que é diferente da mensagem de erro que ocorre comigo. Segue uma parte da minha mensagem de erro:

org.apache.jasper.JasperException: javax.el.ELException: Problems calling function [spring:mvcUrl]
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:639)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:515)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:170)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1370)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1116)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

Outro problema ocorre no tempo 3:15 quando ele descomenta as duas linhas no Inicializador.java. Quando ele descomenta as duas linhas e salva o Inicializador.java não fica nenhum erro para ele. No meu caso, quando faço isso, ocorre o erro na 2ª linha que é Log4jConfigLister cannot be resolved to a type.

O que está acontecendo? Alguém poderia me ajudar, por favor?

Estou com a versão 13 do JDK e a versão mais recente do Eclipse (2020-06).

5 respostas

Tentei fazer as coisas que o moderador disse no post abaixo:

https://cursos.alura.com.br/forum/topico-erro-em-log4jconfiglistener-107996

Mudei a versão do Spring no pom.xml para 4.1.0.RELEASE e adicionei o import org.springframework.web.util.Log4jConfigListener; na classe Inicializador.java.

A mudança da versão do Spring fez a página parar de funcionar (erro 404) e a segunda mudança dá erro na classe Inicializador pois o import não é reconhecido quando se usa a versão 5.1.5.RELEASE do Spring.

O problema continua sem solução, o curso continua com graves deficiências e parece que a Alura se recusa a reconhecer que os cursos de JPA precisam serem refeitos do zero.

Estamos pagando por esses cursos e não temos que ficar aguentando esse tipo de desconsideração. Estou há 1 mês parado nestes cursos quebrados de JPA, pagando sem conseguir avançar e a Alura está ignorando.

Oi Rafael,

Desculpe a demora da resposta. Vc teria o seu código para compartilhar?

De qq forma e só para avisar, estamos regravando esse curso para atualizá-lo e focar melhor no topico de pesquisas com JPA (sem usar o Spring MVC).

abs, Nico

Olá Rafael, tudo bem com você?

Antes de mais nada peço perdão pela experiência ruim no inicio do curso, tanto os cursos de SpringMVC, quanto o de JPA estão sendo regravados no momento para ter um conteúdo de qualidade e sem problemas por conta de versões!

Eu fiz download do projeto e provavelmente o erro que você teve era que não há o método do cadastraProduto, correto?

Para solucionar vamos fazer o seguinte:

1, Pode utilizar o projeto padrão que esta no link do treinamento, pois não iremos fazer downgrade da versão do Spring, ok?

Em ProdutoController.java

Vamos mudar a assinatura do @RequestMapping do método salvar para:

    @RequestMapping(value="/cadastrar", method=RequestMethod.POST, name="buscarProdutos")
    public String salvar(@ModelAttribute @Valid Produto produto, BindingResult result, RedirectAttributes atts) {

E ao invés de utilizar esse spring:mvcUrl que está gerando tanto problema, vamos acessar pelo link mesmo da seguinte maneira:

form.jsp

Vamos trocar a tag <form pela seguinte:

<form class="form-group" method="post" action="<c:url value="/produto/cadastrar"/>">    

Agora as mudanças necessárias ditas no vídeo em:

Produto.java

    @ManyToMany
    private List<Categoria> categorias = new ArrayList<>();


    public void setCategorias(List<Categoria> categorias) {
        this.categorias = categorias;
    } 

    public List<Categoria> getCategorias() {
        return categorias;
    }

Bem, feito todo esse processo você terá o mesmo erro que o instrutor, que é o NoSession

Mas caso você queira ter certeza que essas mudanças deram certo, você pode fazer em Produto.java uma mudança rapidinho que é:

    @ManyToMany(fetch = FetchType.EAGER)
    private List<Categoria> categorias = new ArrayList<>();

Dessa maneira estamos definindo que ao buscar os Produtos queremos trazer instantaneamente também todas as categorias, dessa forma quando clicarmos no botão editar teremos corretamente:

image

E ai você pode voltar o @ManyToMany e seguir conforme o instrutor ensina :)

Novamente, peço perdão pelo inconveniente!

Abraços!

Boa tarde, Geovani. Fiz todas as modificações que você indicou no código e testei primeiro com o:

@ManyToMany(fetch = FetchType.EAGER)
private List<Categoria> categorias = new ArrayList<>();

Conforme você sugeriu. Com isso apareceu o formulário que você indicou de Novo Produto. Quando eu retorno para:

@ManyToMany
private List<Categoria> categorias = new ArrayList<>();

Ocorre um erro quando tento clicar em Editar que eu acredito que seja equivalente ao do vídeo do instrutor, mas que contém algumas diferenças. Segue abaixo parte da página de erro que apareceu para mim:

HTTP Status 500 – Internal Server Error
Type Exception Report

Message An exception occurred processing [WEB-INF/views/produto/form.jsp] at line [61]

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

org.apache.jasper.JasperException: An exception occurred processing [WEB-INF/views/produto/form.jsp] at line [61]

58:                     </label><br>
59:                     <c:forEach items="${categorias}" var="categoria" varStatus="status">
60:                         <c:set var="contains" value="false"/>
61:                         <c:forEach items="${produto.categorias}" var="categoriaProduto" varStatus="statusProduto">
62:                             <c:if test="${categoriaProduto.id == categoria.id}">
63:                                 <c:set var="contains" value="true"/>        
64:                             </c:if>

Root Cause

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.caelum.model.Produto.categorias, could not initialize proxy - no Session

Gostaria, por favor, de confirmar se isso equivale mesmo a mensagem de erro do vídeo?

Olá Rafael, tudo bem?

Isso mesmo, o erro é igual o do instrutor de No Session causado pela falha de inicializar a coleção de Produtos.categoria

Que indica corretamente que não há um EntityManagerdisponível para obter esses dados :)

Abraços!