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

Injeção de Dependências com CDI

Oi gente!

Ao carregar o servidor http://localhost:8086/vraptor-produtos/produto/lista ,ocorre o seguinte erro:

HTTP Status 404 - /vraptor-produtos/produto/lista
type Status report
message /vraptor-produtos/produto/lista
description The requested resource is not available.
Apache Tomcat/8.0.29

Aqui está o código das minhas classes:

Classe EntityManagerProducer

package br.com.caelum.vraptor.producers;

import javax.enterprise.context.SessionScoped;
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;

import br.com.caelum.vraptor.util.JPAUtil;

public class EntityManagerProducer {

    @Produces @SessionScoped
    public EntityManager producer() {
        return JPAUtil.criaEntityManager();

    }

}

ProdutoDao

public class ProdutoDao {

    private final EntityManager em;

    @Inject
    public ProdutoDao(EntityManager em) {
        this.em = em;
    }

    @Deprecated
    public ProdutoDao() {
        this(null);
    }

    public void adiciona(Produto produto) {
        em.getTransaction().begin();
        em.persist(produto);
        em.getTransaction().commit();
    }

    public void remove(Produto produto) {
        em.getTransaction().begin();
        em.remove(busca(produto));
        em.getTransaction().commit();
    }

    public Produto busca(Produto produto) {
        return em.find(Produto.class, produto.getId());
    }

    @SuppressWarnings("unchecked")
    public List<Produto> lista() {
        return em.createQuery("select p from Produto p").getResultList();
    }
}

ProdutoController

@Controller
public class ProdutoController {

    private final Result result;
    private final ProdutoDao dao;

    @Inject
    public ProdutoController(Result result, ProdutoDao dao) {
        this.result = result;
        this.dao = dao;
    }

    @Deprecated
    public ProdutoController() {
        this(null, null);
    }

    @Get
    public void sobre() {
    }

    @Get
    public void lista() {
        result.include("produtoList", dao.lista());
    }

    @Get
    public void listaEmXml() {
        result.use(Results.xml()).from(dao.lista()).serialize();
    }

    @Get
    public void listaEmJson() {
        result.use(Results.json()).from(dao.lista()).serialize();
    }

    @Get
    public void formulario() {
    }

    @Post
    public void adiciona(Produto produto) {
        dao.adiciona(produto);
        result.include("mensagem", "Produto adicionado com sucesso!");
        result.redirectTo(this).lista();
    }

    @Remove
    public void remove(Produto produto) {
        dao.remove(produto);
        result.include("mensagem", "Produto removido com sucesso!");
        result.redirectTo(this).lista();
    }

}

lista.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Lista de Produtos</title>
</head>
<link rel="stylesheet" type="text/css" href="../bootstrap/css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="../base.css"/>
<body>
<h3>Lista de Produtos</h3>
<table class="table table-stripped table-bordered table-hover">
    <thead>
        <tr>
        <th>Nome</th>
        <th>Valor</th>
        <th>Quantidade</th>
        <th>Remover</th>
        </tr>
    </thead>

    <tbody>
        <c:forEach items="${produtoList}" var="produto">
            <tr>
                <td>${produto.nome}</td>
                <td>${produto.valor}</td>
                <td>${produto.quantidade}</td>
                <td>
                  <a href="<c:url value='/produto/remove?produto.id=${produto.id}'/>">Remover</a>
                </td>
            </tr>
        </c:forEach>
    </tbody>
</table>
    <c:if test="${not empty mensagem }">
        <div class="alert alert-success">${mensagem}</div>
    </c:if>
</body>
      <a href="<c:url value='/produto/formulario'/>">Adicionar mais produtos!</a><br/>
               <a href="<c:url value='/produto/listaEmXml'/>">Lista em XML</a><br/>
               <a href="<c:url value='/produto/listaEmJson'/>">Lista em Json</a><br/>
</html>

Não sei como resolver o problema, por que aparentemente segui todos os passos da aula!

2 respostas

Oi Cremildo, onde que você colocou seu arquivo lista.jsp?

Ele precisa estar na pasta /produto/lista.jsp

Abraços!

solução!

Oi Philipe!

O problema é que tinha deixados duas classes ProdutoController no mesmo directório. ProdutoController e ProdutoController2, ambas com anotação @Controller. A diferença é que a ProdutoController2 apresenta pouca injecção de dependências, e ProdutoController usa muito os recursos da CDI.

Por vezes crio uma cópia das classes para não perder as aulas anteriores, o que facilita futuras revisões das aulas.

Para resolver o problema, tive que retirar a anotação @Controller da classe ProdutoController2.

Em todo o caso, obrigado pela atenção!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software