Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
10
respostas

Erro 404 o carregar o form de produtos

Estou tentando fazer o mapeamento para

@Controller
public class ProdutosController {
   @RequestMapping("/produtos/form")
    public String form(){
        System.out.println("form produtos");
        return "/produtos/form";
    }
}

mas não funciona, mas se eu mudar @RequestMapping("/produtos/form") para @RequestMapping("/produtos") tudo funciona. Qual o motivo desse erro?

OBS. O erro não é uma exception, é simplesmente um 404 mas se eu mapear de um jeito diferente funciona, isso me deixou bem confuso.

10 respostas

Olá Ramires, o que exatamente nao funciona? ele nao exibe no console a string "form produtos" ??? ou nao exibe a pagina form.jsp?

com @RequestMapping("/produtos/form") no navegador vc terá que digitar: localhost:8080/{contexto}/produtos/form

aí ele tem que entrar no metodo form() exibir o texto e buscar uma view chamada form.jsp na pasta produtos

se voce mudar para @RequestMapping("/produtos") sua url mudará, para acessar o form vc terá que digitar no navegador: localhost:8080/{contexto}/produtos

Olá Daniel, ele imprime no console, mas não exibe, e enquanto a mudar a url no navegador eu mudo também, é por esse motivo que não consigo entender o motivo desse erro.

Já tentou mudar o nome da jsp? tipo para formProduto.jsp e no retorno da string vc colocar /produtos/formProduto, só para desencargo?

Se for o caso tenta colocar o RequestMapping na classe e no metodo, assim:

@Controller
@RequestMapping(value="/produtos")
public class ProdutosController

e no método:

 @RequestMapping(value="/form")
    public String form(){

já mudei o nome do arquivo também, mesmo achando que não tem influência, mas continua do mesmo jeito, também fiz o que você falou sobre mapear a classe e o método e ficou da mesma forma, ele acessa o método "imprime no console" mas lança um 404 no navegador.

imagem do erro -> http://ramiresmoreira.tumblr.com/post/156315013854

só para constar que basta eu mudar o mapeamento que funciona ou seja

@RequestMapping("/produto")
    public String form(){
}

e no navegador localhost:8080/casadocodigo/produto

Bom, se ele imprime no console, quer dizer que o spring esta reconhecendo o controller e encontrando o metodo, se esta dando erro 404, é que o spring nao está achando a pagina form.jsp, alguma coisa esta acontecendo para o spring se perder e não encontrar a view, tem como voce colocar seu AppWebConfiguration.java ?

Aí está.

package org.casadocodigo.loja.conj;

import org.casadocodigo.loja.controllers.HomeController;
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;

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

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

}
solução!

Eu sei que é meio besta isso, mas tenta mudar de:

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

para

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

funcionou, \0/. Você saberia me explicar o motivo? pq se não funcionasse de nenhuma forma eu até entenderia.

De alguma forma ele deve se perder no contexto em relação ao WEB-INF, na verdade nao deveria funcionar de nenhuma forma sem o "/" antes do web-inf, pode ser algum bug no tomcat, realmente não sei, vou ficar devendo essa.

Vou tentar simular aqui para ver se acontece e entender o que acontece.

tudo bem, e muito obrigado pela ajuda.