Solucionado (ver solução)
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.