3
respostas

Taglib Spring com erro no "mvcUrl" na jsp

Pessaol tenho meu jsp com a taglib do spring declarada e mesmo assim o atalho mcvUrl não funciona:

<%@ 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">
<html>
<head>
<meta charset="UTF-8">
<title>Livros de java, Android, Iphone, PHP, Ruby e muito mais -
    Casa do código</title>
</head>
<body>
    <h1>Lista de produtos</h1>
    <h3>${sucesso}</h3>
    <table>
        <tr>
            <td>Título</td>
            <td>Descrição</td>
            <td>Páginas</td>
        </tr>
        <c:forEach var="produto" items="${produtos}" varStatus="status">
            <tr>
                <td><a href="${s:mvcUrl('PC#detalhe').arg(0,produto.id).build() }">${produto.titulo}</a></td>
                <td>${produto.descricao}</td>
                <td>${produto.paginas}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

Erro:

mai 25, 2017 4:57:01 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/casadocodigo] threw exception [An exception occurred processing JSP page [/WEB-INF/views/produtos/lista.jsp] at line [23]

20:         </tr>
21:         <c:forEach var="produto" items="${produtos}" varStatus="status">
22:             <tr>
23:                 <td><a href="${s:mvcUrl('PC#detalhe').arg(0,produto.id).build() }">${produto.titulo}</a></td>
24:                 <td>${produto.descricao}</td>
25:                 <td>${produto.paginas}</td>
26:             </tr>


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

Olá Elias,

Vi no seu outro post, que o seu método no controller está conforme abaixo, note que você declarou o método com letra maiuscula, porém o padrão no Java é sempre fazer os métodos em camelCase(https://pt.wikipedia.org/wiki/CamelCase) Logo, seu método deve sempre iniciar em minusculo, basta alterar o nome do seu método no ProdutoController para detalhe ao invés de Detalhe que irá funcionar.

@RequestMapping("/detalhe")
    public ModelAndView Detalhe(Integer id) {
        ModelAndView mav = new ModelAndView("produtos/detalhe");
        Produto prod = produtoDao.find(id);
        mav.addObject("produto", prod);

        return mav;
    }

Bom dia Denis,

realmente estava fora do padrão. Já arrumei e mesmo assim continua o erro:

java.lang.IllegalArgumentException: Mapping mappingName not found: PC#detalhe
    org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.fromMappingName(MvcUriComponentsBuilder.java:245)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    org.apache.el.parser.AstFunction.getValue(AstFunction.java:199)
    org.apache.el.parser.AstValue.getValue(AstValue.java:137)
    org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
    org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:704)
    org.apache.jsp.WEB_002dINF.views.produtos.lista_jsp._jspx_meth_c_005fforEach_005f0(lista_jsp.java:198)
    org.apache.jsp.WEB_002dINF.views.produtos.lista_jsp._jspService(lista_jsp.java:149)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:443)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:172)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1228)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1011)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

Só uma observação, eu venho do mundo .net onde uso bastante o CamelCase, e no link que você enviou diz: "CamelCase é a denominação em inglês para a prática de escrever palavras compostas ou frases, onde cada palavra é iniciada com Maiúsculas e unidas sem espaços.[1] Existem duas formas de classificá-la: a primeira é conhecida como UpperCamelCase (de letra inicial maiúscula, também conhecida como PascalCase) e a segunda lowerCamelCase (de letra inicial minúscula)." . Ou seja as palavras sempre começam por maiúsculas por padrão, mais Java usa "lowerCamelCase" e estou acostumado com o UpperCamelCase.

Pra mim está sendo um desafio me acostumar com esse padrão hehehe.

Obrigado pela ajuda meu amigo.

Pessoal continuo parado sem solução.

Alguém pode me ajudar?!