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

Erro 404 no exercício 2

Olá a todos!

Eu estava realizando os exercícios da aula 2, na criação do controller para exibir o formulário de cadastro de livros. Porém quando carrego o Tomcat e acesso a URL "http://localhost:8080/casadocodigo/produtos/form" recebo um erro 404, com a seguinte mensagem:

"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."

Segue o código do controller:

package br.com.casadocodigo.loja.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ProdutosController {

    @RequestMapping("/produtos/form")
    public String exibeFormulario() {
        return "produtos/form";
    }
}

Minha pasta views está com assim: "WEB-INF/views/produtos/form.jsp"

O exercício anterior, de criar um controller para exibir uma página chamada "home.jsp" funcionou sem problemas!

Obrigada!

5 respostas

Uma outra coisa que notei foi quando eu mudo o Request Mapping de

@RequestMapping("/produtos/form")

para

@RequestMapping("/produtos")

a chamada para página funciona no navegador.

Porém, na URL do navegador se eu chamar a página com barra no final...

"http://localhost:8080/produtos/"

Ao invés de ...

"http://localhost:8080/produtos"

Volta a ocorrer o erro 404. Por que isso acontece?

Obrigada.

Oi Luanda,

Respondendo de baixo para cima, as URL's http://localhost:8080/produtos e http://localhost:8080/produtos/ são realmente diferentes. Em geral todo framework MVC considera que a barra no fim, é uma chama a outra URL e sem a barra no fim, é o recurso de produtos mesmo.

Se quiser garantir que com ou sem a barra, funcione, você precisará realizar algumas configurações. Mas em geral, não nos preocupamos com isso.

Sobre a primeira dúvida, coloca o código da sua configuração aqui, para que eu possa dar uma analisada. É a classe AppWebConfiguration se não me engano.

Abraço

Bom dia, Paulo!

Segue o código da classe "ServletSpringMvc":

package br.com.casadocodigo.loja.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class ServletSpringMvc extends AbstractAnnotationConfigDispatcherServletInitializer {

@Override protected Class<?>[] getRootConfigClasses() { return null; }

@Override protected Class<?>[] getServletConfigClasses() { return new Class[] { AppWebConfiguration.class }; }

@Override protected String[] getServletMappings() { return new String[] { "/" }; } }

Aqui está o código da classe "AppWebConfiguration":

package br.com.casadocodigo.loja.config;

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.controller.HomeController; import br.com.casadocodigo.loja.controller.ProdutosController;

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

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

Bom dia!

Realizei uma alteração dentro do método internalViewResolver e parece que funcionou! A alteração foi de:

"resolver.setPrefix("WEB-INF/views/");"

para

"resolver.setPrefix("/WEB-INF/views/");"

Coloquei um "/" antes de "WEB-INF".

Acho que me esqueci dessa configuração.

Agora está funcionando ok.

Obrigada!

solução!

Exato, isso é necessário sim, para que o Spring procure pelos arquivos a partir da raiz /. Sem a barra, ele vai procurar pelo caminho relativo.

Que bom que funcionou.

Abraço