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

method = RequestMethod.GET

Não estou conseguindo chamar a página lista.jsp passando a diferenciação para o Mapping só com o paramento method = RequestMethod.GET. Fiz um teste com a anotação @RequestMapping("/produtos/lista") e funcionou. Além desse teste verifique o method = RequestMethod.POST e funcionou perfeitamente. No log de erro consta:

WARN  [org.springframework.web.servlet.PageNotFound] (default task-4) No mapping found for HTTP request with URI [/casacodigo/produtos/lista] in DispatcherServlet with name 'dispatcher'

Segue a classe ProdutoController

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import br.com.casacodigo.loja.dao.ProdutoDAO;
import br.com.casacodigo.loja.model.Produto;
import br.com.casacodigo.loja.model.TipoPreco;

@Controller
@RequestMapping("produtos")
public class ProdutosController {

    @Autowired
    private ProdutoDAO produtoDAO;

    @RequestMapping("/form")
    public ModelAndView form() {

        ModelAndView modelAndView = new ModelAndView("/produtos/form");
        modelAndView.addObject("tipos", TipoPreco.values());

        return modelAndView;
    }

    @RequestMapping(method = RequestMethod.POST)
    public String gravar(Produto produto) {
        System.out.println("Produto " + produto.getTitulo() + " gravado com sucesso!");
        produtoDAO.gravar(produto);
        return "/produtos/ok";
    }

    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView listar() {
        List<Produto> produtos = produtoDAO.listar();
        ModelAndView modelAndView = new ModelAndView("/produtos/lista");
        modelAndView.addObject("produtos", produtos);

        return modelAndView;
    }
}

Segue a view lista.jsp

<%@ 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"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Livros de Java, Android, iPhone, Ruby, PHP e muito mais -
    Casa do Código</title>
</head>
<body>
    <h1>Lista de Produtos</h1>
    <table>
        <tr>
            <td>Título</td>
            <td>descrição</td>
            <td>Páginas</td>
        </tr>

        <c:forEach items="${produtos}" var="produto">
            <tr>
                <td>${produto.titulo}</td>
                <td>${produto.descricao}</td>
                <td>${produto.paginas}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>
8 respostas

Oi hugo

Meu chute é que você está pedindo para o spring fazer um get, mas ele não sabe para onde. Olhando o texto dessa aula eu vi que o instrutor fez isso :

@RequestMapping(value="/produtos", method=RequestMethod.GET)

Pode fazer esse teste ?

abraço

Caio, fiz o teste e continua com o mesmo erro. Já tinha feito esse teste antes.

Eu acredito que seja algum detalhe relacionado ao meu servidor, pois estou usando o WildFly.

Valeu pela atenção!!!!

Está falando o mapeamento da request

@RequestMapping("/lista", method = RequestMethod.GET)

não

@RequestMapping(method = RequestMethod.GET)

Luram, a classe ProdutosController contem dois métodos com o mesmo path (RequestMapping), sendo um método para gravar produto e que usa o POST e o outro para listar os produtos e usa GET. Para distinguir esses dois métodos é usado o tipo da requisição (POST ou GET).A ideia central não é usar path diferente para cada método (ex: "/lista" e "/grava") e sim o mesmo path e os diferenciar pelo o tipo de requisição. Dessa forma o path desses dois métodos é "produto" e que já consta como anotação da classe (@RequestMapping("produtos")).

Value pela atenção!!!!

Descobri o erro. Neste projeto eu estou usando o servidor WildFly e substitui a dependência no pom.

De:

<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-servlet-api</artifactId>
    <version>7.0.30</version>
    <scope>provided</scope>
</dependency>

Para:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
</dependency>

Como estava ocorrendo esses erro resolvi testar alterando novamente para a primeira dependecy e com isso voltou a funcionar.

solução!

Olá Hugo, se entendi bem, você está tentando acessar o metodo de listar através do metodo GET utilizando qual URL ? seria :http://localhost:8080/casadocodigo/produtos/lista , se sim, o Spring realmente não vai encontrar. abaixo tentei explicar, mas já vou logo dizendo, sou horrível com explicações rsrs,

vamos lá, ao mapear sua requisição na class vc informou pro Spring que todos os métodos dessa class são derivados do /produtos. como no metodo gravar e listar vc diferencia ele apenas pela requisição, quando enviado post ele cai no método gravar, como você mesmo disse que realizou o teste e funcionou, mas quando você tenta acessar via GET, ele não acha a pagina porque ele não conhece o endereço

http://localhost:8080/casadocodigo/produtos/lista

se você colocar na URL o endereço sem o /lista você vai perceber que ele vai encontrar o método e realizar a busca te retornando para a pagina de listagem.Então teste a seguinte URL:

http://localhost:8080/casadocodigo/produtos

vou deixar aqui o meu código parecido com o seu:

@Controller
@RequestMapping("/produtos")
public class ProdutosController {

    @Autowired
    private ProdutoDAO produtoDAO;

    @RequestMapping("/form")
    public ModelAndView form() {
        return new ModelAndView("/produtos/form").addObject("tipos", TipoPreco.values());
    }

    @RequestMapping(method = RequestMethod.POST)
    public String gravar(Produto produto) {
        System.out.println("Produto " + produto.getTitulo() + " gravado com sucesso!");
        produtoDAO.gravar(produto);
        return "/produtos/ok";
    }

    @RequestMapping(value="/lista", method = RequestMethod.GET) // se deixar sem o value a URL para acessar esse metodo é http://localhost:8080/casadocodigo/produtos
    public ModelAndView listar() {
        List<Produto> produtos = produtoDAO.listar();
        return new ModelAndView("/produtos/lista").addObject("produtos", produtos); 
//caso não queria utilizar o value="/lista", o seu ModelAndView deveria ser apenas ModelAndView("/produtos")
    }
}

Descobriu o erro? menos mal, acho que entendi mal sua duvida e parece que acabei postando uma resposta que não resolveria seu problema, mas tudo bem, é a vida rsrsrs. Bons estudos e se precisar tamos ai.

Imagina Willian! Toda ajuda é bem vinda!!!! Eu não sabia como resolver isso e considero toda ajuda! Value pela força e por dedicar tempo pra me ajudar!!! Obrigado mesmo!