3
respostas

Terminei o curso mas fiquei com 3 dúvidas...

Terminei o curso, porem fiquei com 3 dúvidas que não foram abordadas no curso e eu não consegui resolver procurando na internet. São elas:

1) Porque no form da detalhe.jsp foi usado c:url na action e na form.jsp foi usado a taglig mvcUrl? Tentei usar a taglig na detalhe.jsp e quebrou com o erro abaixo:

javax.persistence.NoResultException: No entity found for query org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:498) br.com.casadocodigo.loja.daos.ProdutoDAO.buscaPorId(ProdutoDAO.java:29) br.com.casadocodigo.loja.daos.ProdutoDAO$$FastClassBySpringCGLIB$$92ebe7c5.invoke() org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98) org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:266) org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653) br.com.casadocodigo.loja.daos.ProdutoDAO$$EnhancerBySpringCGLIB$$1a711165.buscaPorId() br.com.casadocodigo.loja.controllers.CarrinhoComprasController.criaItem(CarrinhoComprasController.java:33) br.com.casadocodigo.loja.controllers.CarrinhoComprasController.add(CarrinhoComprasController.java:27) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:498) org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:721) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863) javax.servlet.http.HttpServlet.service(HttpServlet.java:650) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 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:52)

2) Como customizar o parâmetro do mvcUrl() quando o controllers e métodos são iguais?

Exemplo: (ProdutoController com método gravar e PrecoController com método gravar) Como customizar a chamada para mvcUrl('PC#gravar') ?

3) Criei a pasta resources dentro de webapp mais todos os arquivos estáticos tomam 404 no browser. Não consegui resolver este problema. O browser sempre retorna 404.

GET http://localhost:8080/casadocodigo/resources/css/cssbase-min.css -> 404

3 respostas

Olá Josué,

Vamos lá.

1) Na verdade é muito uma questão de escolha, usar <c:url> resolve o problema de resolução dos contextos de projeto em caminhos absolutos. Ja mvcUrl() permite ainda desacoplar do padrao de url utilizado, bastando utilizar uma inferência pro método do controller, facilita bastante a manutenção se nossas urls mudarem futuramente.

Na questão do erro citado, perceba que a exception lançada foi uma NoResultException da JPA . Significa que tentou buscar uma informação - getSingleResult() - e não obteve resultado. Sendo assim parece que tudo deu certo com a url, já que o erro está na outra fronteira da aplicação (acesso a dados). De uma olhada no HTML gerado pelo JSP, bem no ponto onde você usa mvcUrl() verifique se o caminha está ok. Verifique também se, acessando essa url, o processamento chega até seu controller e action desejados.

2) Nestes casos você pode inferir pela propriedade name de @RequestMapping. Ela serve pra identificar unicamente uma action mapeada (independente de controller).

Exemplo:

@RequestMapping(value="/suaUrl", name="nomeDaAction")
public String suaAction() {
 ...
}
<... action="${spring:mvcUrl('nomeDaAction').build()}" ... >

3) É preciso liberar a aplicação para responder aos recursos estáticos. Provavelmente a servlet do Spring está tentando resolver as requisições para seus css's etc. Devemos fazer com que, caso a Servlet do spring não consiga resolver a requisição, ela repasse a responsabilidade ao Tomcat, que conseguirá devolver esse tipo de recurso normalmente.

É possível fazer isso na sua classe de configuração, sobrescrevendo um método da classe WebMvcConfigurerAdapter

class WebAppConfig extends WebMvcConfigurerAdapter {
    ...    
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}

Abraço

1) Quando uso o mvcUrl ele monta a uri: "http://localhost:8080/casadocodigo/carrinho/add?produtoId&tipoPreco" Os parâmetros chegam null no controller.

Quando uso o c:url ele monta a uri: "/casadocodigo/carrinho/add". Os parametros chegam normal no controller.

Meu form está assim:

<form action="<c:url value='/carrinho/add' />" method="post" class="container"> 
<!--<form action="${s:mvcUrl('CCC#add').build() }" method="post" class="container">-->
    <ul id="variants" class="clearfix">
    <input type="hidden" name="produtoId" value="${produto.id}" />
    <c:forEach items="${produto.precos}" var="preco">
        <li class="buy-option">
            <input type="radio" name="tipoPreco" class="variant-radio" id="tipoPreco" value="${preco.tipo}" checked="checked" /> 
            <label class="variant-label">${preco.tipo}</label>
            <p class="variant-price">${preco.valor}</p>
        </li>
    </c:forEach>
    </ul>
    <button type="submit" class="submit-image icon-basket-alt" alt="Compre Agora" title="Compre Agora ${produto.titulo}"></button>
</form>

E o controller está assim:

@RequestMapping(value="/add", method=RequestMethod.POST)
    public ModelAndView add(Integer produtoId, TipoPreco tipoPreco) {
        ModelAndView modelAndView = new ModelAndView("redirect:/carrinho");
        System.out.println("1- produtoID:"+produtoId+" tipoPreco:"+tipoPreco);
        CarrinhoItem carrinhoItem = criaItem(produtoId, tipoPreco);
        carrinho.add(carrinhoItem);
        return modelAndView;
    }

2) Funcionou!

3) Funcionou!

Amigo, boa noite, após muito mais muito bater cabeça no meu projeto, graças ao seu tópico descobri que o que não estava permitindo com que a view detalhe.jsp enviasse o id e o tipo para o controller era justamente essa sua questão do c:url vs mvcUrl...

Caramba bicho que dor de cabeça isso me deu.

O máximo que eu consgui foi enviar o ID em conjunto com mvcUrl passando como argumento dessa forma:

<form action="${s:mvcUrl('SCC#add').arg(0,product.id).build()}" method="POST">

Eu também tentei passar o tipo do preço via argumento na mvcUrl mas não consegui...

Ou seja, sua questão ainda continua em aberto, porque eu também não obtive êxito.... e olha que eu já tinha passado dessa parte, mas quando refatorei meu código pra usar mvcUrl surgiu esse problema do tipo não chegar no controller e eu fiquei travado no curso ......

Abri um tópico, se quiser dar uma olhada...

https://cursos.alura.com.br/forum/topico-error-reading-price-on-type-br-com-bookstore-model-cartitem-34294