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

Aula 2. Problemas com @RequestMapping("/produtos/formulario")

Acompanhei toda a aula do capítulo 2 e estou enfrentando um problema.

se eu maipeio para:

@RequestMapping("/produtos/formulario")

tenho o seguinte erro:

HTTP Status 404 - /casadocodigo/produtos/WEB-INF/views/produtos/form.jsp

type Status report
message /casadocodigo/produtos/WEB-INF/views/produtos/form.jsp
description The requested resource is not available.
Apache Tomcat/8.0.30

Agora, se eu mapeio para

@RequestMapping("/formulario")

abre o formulário normal e consigo efetuar o cadastro.

Alguém consegue me explicar o motivo?

3 respostas

Oi Vinícius,

A mensagem de erro diz que não encontrou "form" e não "formulario". Sendo assim, você por um acaso não tem um arquivo "formulario.jsp" na raiz do seu projeto e na pasta "produtos" este arquivo não existe ou está com um nome parecido?

O arquivo form.jsp existe e está dentro da pasta produtos. O código funciona normalmente

@RequestMapping("/formulario")
    public ModelAndView exibeFormulario(){
        ModelAndView modelAndView = new ModelAndView("produtos/form");
        modelAndView.addObject("tipos", TipoPreco.values());

        return modelAndView;
    }

mas não entendo por que não consigo alterar o @RequestMapping("/produtos/formulario", pois pelo que eu entendi eu poderia indicar qualquer coisa "/produtos/12345/formulario", desde que no retorno ou no caso atual dentro de ModelAndView eu indicasse o caminho correto.

vou postar algumas classes, as vezes posso ter errado algum detalhe que não estou enxergando. Lembrando que a dúvida era na aula 2 (atualmente estou na 4) portanto o código está diferente de quem está acompanhando até a 2ª aula.

ProdutoController

package br.com.casadocodigo.loja.controllers;

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.servlet.ModelAndView;

import br.com.casadocodigo.loja.dao.ProdutoDao;
import br.com.casadocodigo.loja.models.Produto;
import br.com.casadocodigo.loja.models.TipoPreco;

@Controller
public class ProdutoController {

    @Autowired
    private ProdutoDao dao;

    @RequestMapping("/formulario")
    public ModelAndView exibeFormulario(){
        ModelAndView modelAndView = new ModelAndView("produtos/form");
        modelAndView.addObject("tipos", TipoPreco.values());

        return modelAndView;
    }

    @RequestMapping("/sucesso")
    public String gravar(Produto produto){
        dao.gravar(produto);
        System.out.println(produto);

        return "produtos/cadastrado-com-sucesso";
    }

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

        return modelAndView;
    }
}

AppWebConfiguration

package br.com.casadocodigo.loja.conf;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

import br.com.casadocodigo.loja.controllers.HomeController;
import br.com.casadocodigo.loja.dao.ProdutoDao;


@EnableWebMvc
@ComponentScan(basePackageClasses={HomeController.class, ProdutoDao.class})
public class AppWebConfiguration {

    @Bean
    public InternalResourceViewResolver internalResourceViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("WEB-INF/views/");
        resolver.setSuffix(".jsp");

        return resolver;
    }
}

Bom, se for necessário mais alguma eu posto, mas acho que são essas duas as necessárias.

só lembrando, meu código funciona perfeitamente no estado atual, mas, se troco para ```@RequestMapping("/produtos/formulario") ele dá o erro citado anteriormente.

solução!

Descobri, foi a famosa falta de atenção, na classe AppWebConfiguration no método abaixo estava o problema:

@Bean
    public InternalResourceViewResolver internalResourceViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("WEB-INF/views/");
        resolver.setSuffix(".jsp");

        return resolver;
    }

faltando uma '/' antes de WEB-INF, ficando assim:

@Bean
    public InternalResourceViewResolver internalResourceViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");

        return resolver;
    }

agora meu @RequestMapping está sem problemas.