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

Problema MappingName Spring

Ola pessoal, estou com o problema abaixo e não estou conseguindo identificar, estou seguindo o curso mas não me funciona quando chamo a pagina:

Mapping mappingName not found: PC#detalhe org.apache.jasper.JasperException: javax.el.ELException: Problems calling function 's:mvcUrl'

No controller esta como explicado no exercicio etc: @RequestMapping("/detalhe/{id}") public ModelAndView detalhe(@PathVariable("id") Integer id) { ModelAndView modelAndView = new ModelAndView("produtos/detalhe"); Produto produtos = produtoDAO.find(id); modelAndView.addObject("produto", produtos); return modelAndView; }

Agradeço o suporte. Abs Edvaldo

14 respostas

Oi Edvaldo, o código parece certo mesmo... Faz um teste, para vc não ficar parado. Altera a annotation para ficar assim:

@RequestMapping(value="/detalhe/{id}", name="detalheProduto")

Aí, na jsp, vc usa apenas "detalheProduto".

Oi Alberto. Agradeço sua ajuda. Tentei, mas infelizmente persiste o mesmo erro. Mapping mappingName not found: PC#detalheProduto javax.el.ELException: Problems calling function 's:mvcUrl'

To meio perdido, talvez seja algum caracter errado qualquer "besteira", mas não estou conseguindo resolver.

Agradeço. Abs,

Tira o PC#. deixa só o detalheProduto

Alberto, nao funciona.

Stacktrace:] with root cause java.lang.IllegalArgumentException: Mapping mappingName not found: detalheProduto at org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.fromMappingName(MvcUriComponentsBuilder.java:245) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

Nao estou conseguindo entender porque de não funcionar... ja verifiquei tudo, me certifiquei que estou fazendo igualzinho a video aula e estou perdendo esse tempo todo por um erro ate agora no meu ponto de vista sem nexo... {Mapping mappingName not found}

PAGINA: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://www.springframework.org/tags" prefix="s" %> <!DOCTYPE html>

<meta charset=UTF-8">

${sucesso}
TituloDescriçaoPaginas
${produto.titulo} ${produto.descricao}${produto.paginas}

CLASS: @RequestMapping("/detalhe/{id}") public ModelAndView detalhes(@PathVariable("id") Integer id) { ModelAndView modelAndView = new ModelAndView("produtos/detalhe"); Produto produtos = produtoDAO.find(id); modelAndView.addObject("produtos", produtos); return modelAndView; }

Oi Edvaldo, também não vi o problema :(. As urls mapeadas nesse controller estão sendo encontradas? Você consegue acessar a página de detalhe do produto diretamente pelo navegador?

Se quiser que eu olhe um pouco mais, joga o projeto no github que eu baixo :).

Alberto,

Todas as outras sim, mas a detalhe me da 404 e a list me da o problema que escrevi antes {Problems calling function 's:mvcUrl'}.

Realmente estou meio perdido, e não estou conseguindo entender, ate o exercício 9 funcionava tudo perfeito, no 10 esses problemas. Tenho pouca experiência com Spring e estou tomando uma surra :D

Agradeço seu suporte/Ajuda.

O list da esse erro pq ele não está achando o mapeamento do detalhe. Posta aqui, usando o botão inserir código, o código do controller que tem o método de detalhe. Pode ser? Tem alguma coisa aí... Ou manda o link do projeto no github.

package br.com.casadocodigo.loja.controllers;

import java.util.List;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import br.com.casadocodigo.loja.dao.ProdutoDAO; import br.com.casadocodigo.loja.infra.FileSaver; import br.com.casadocodigo.loja.models.Produto; import br.com.casadocodigo.loja.models.TipoPreco; import br.com.casadocodigo.loja.validaton.ProdutoValidation;

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

@Autowired private ProdutoDAO produtoDAO;

@Autowired private FileSaver fileSaver;

@org.springframework.web.bind.annotation.InitBinder public void InitBinder(WebDataBinder binder) { binder.addValidators(new ProdutoValidation()); } @RequestMapping("/form") public ModelAndView form(Produto produto) { ModelAndView modelAndView = new ModelAndView("produtos/form"); modelAndView.addObject("tipos", TipoPreco.values()); return modelAndView ; } @RequestMapping(method=RequestMethod.POST) public ModelAndView gravar(MultipartFile sumario, @Valid Produto produto, BindingResult result, RedirectAttributes redirectAttributes) { if(result.hasErrors()) { return form(produto); } String path = fileSaver.write("arquivos-sumario", sumario); produto.setSumarioPath(path); produtoDAO.gravar(produto); System.out.println(produto); redirectAttributes.addFlashAttribute("sucesso", "Produto cadastrado com sucesso!"); return new ModelAndView("redirect:produtos"); } @RequestMapping(method=RequestMethod.GET) public ModelAndView listar() { ModelAndView modelAndView = new ModelAndView("produtos/lista"); List produtos = produtoDAO.listar(); modelAndView.addObject("produtos", produtos); return modelAndView; } @RequestMapping("/detalhe/{id}") public ModelAndView detalhe(@PathVariable("id") Integer id) { ModelAndView modelAndView = new ModelAndView("produtos/detalhe"); Produto produtos = produtoDAO.find(id); modelAndView.addObject("produtos", produtos); return modelAndView; }

}

package br.com.casadocodigo.loja.controllers;

import java.util.List;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import br.com.casadocodigo.loja.dao.ProdutoDAO;
import br.com.casadocodigo.loja.infra.FileSaver;
import br.com.casadocodigo.loja.models.Produto;
import br.com.casadocodigo.loja.models.TipoPreco;
import br.com.casadocodigo.loja.validaton.ProdutoValidation;

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

    @Autowired
    private ProdutoDAO produtoDAO;

    @Autowired
    private FileSaver fileSaver;

    @org.springframework.web.bind.annotation.InitBinder
    public void InitBinder(WebDataBinder binder) {
        binder.addValidators(new ProdutoValidation());
    }
    @RequestMapping("/form")
    public ModelAndView form(Produto produto) {
        ModelAndView modelAndView = new ModelAndView("produtos/form");
        modelAndView.addObject("tipos", TipoPreco.values());
        return modelAndView ;
    }
    @RequestMapping(method=RequestMethod.POST)
    public ModelAndView gravar(MultipartFile sumario, @Valid Produto produto, BindingResult result, RedirectAttributes redirectAttributes) {
        if(result.hasErrors()) {
            return form(produto);
        }
        String path = fileSaver.write("arquivos-sumario", sumario);
        produto.setSumarioPath(path);
        produtoDAO.gravar(produto);
        System.out.println(produto);
        redirectAttributes.addFlashAttribute("sucesso", "Produto cadastrado com sucesso!");
        return new ModelAndView("redirect:produtos");
    }
    @RequestMapping(method=RequestMethod.GET)
    public ModelAndView listar() {
        ModelAndView modelAndView = new ModelAndView("produtos/lista");
        List<Produto> produtos = produtoDAO.listar();
        modelAndView.addObject("produtos", produtos);
        return modelAndView;
    }
    @RequestMapping("/detalhe/{id}")
    public ModelAndView detalhe(@PathVariable("id") Integer id) {
        ModelAndView modelAndView = new ModelAndView("produtos/detalhe");
        Produto produtos = produtoDAO.find(id);
        modelAndView.addObject("produtos", produtos);
        return modelAndView;
    }

}

Oi Edvaldo, realmente não estou vendo o erro.. Quando vc acessa direto pela url, pode estar dando 404 porque ele não está achando o mapeamento ou pq a página detalhe não existe. Acho importante que vc mande o link do projeto no github :).

Como não vejo problema no código, vou dar um chute aqui. No seu eclipse, lá em cima no meu project, tem uma opção chamada build automatically.. Ela está marcada? Caso não esteja, pode ser que sua alteração não esteja sendo refletida no seu projeto.

Oi Alberto.

Sim, è configurado o build automatico. Vou versionar mais tarde no git (agora estou no trabalho), e te giro o link. Por enquanto obrigado pelo suporte. Abs.

Oi Alberto.

Segue o link do git. https://github.com/didiomelo/didiomelo.git Aguardo. Obrigado. Edvaldo

Edvaldo, deu ruim. Baixei seu projeto e funcionou corretamente! Estou desconfiado que suas alterações no projeto não estão sendo refletidas no build do projeto e ele não está indo para o tomcat.

Nesse caso, tenta dar um clean no projeto. Vai no terminal e faz assim:

mvn clean eclipse:clean eclipse:eclipse
solução!

Oi Alberto. Agradeço muito sua disponibilidade e ajuda. O problema era por algum motivo desconhecido, a pasta resources (src/main) era dentro da pasta java. Me dava o erro no markers do Eclipse, mas eu não tinha visto, por isso não me compilava. Como antes do topico 11 do curso funcionava, acabei perdendo tempo pensando que fosse algum problema do Spring etc. Forte Abraço e obrigado.