Boa tarde amigos!
Na prática numero 9, não consegui implementar o link de cada produto que redireciona para a tela de detalhes da forma explicada:
<a href="${s:mvcUrl('PC#detalhe').arg(0, produto.id).build()}">${produto.titulo }</a>
O controlador:
@RequestMapping("/detalhe/{id}")
public ModelAndView detalhe(@PathVariable("id") Integer id){
ModelAndView modelAndView = new ModelAndView("produtos/detalhe");
Produto produto = produtodao.find(id);
modelAndView.addObject("produto", produto);
return modelAndView;
}
O link dessa forma joga uma excepção:
type Exception report
message An exception occurred processing JSP page /WEB-INF/views/produtos/lista.jsp at line 27
description The server encountered an internal error that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/views/produtos/lista.jsp at line 27
24: <c:forEach items="${produtos }" var="produto">
25: <tr>
26: <td>
27: <a href="${s:mvcUrl('PC#detalhe').arg(0, produto.id).build()}">${produto.titulo }</a>
28: </td>
29: <td>${produto.descricao }</td>
30: <td>${produto.paginas }</td>
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
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:621)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
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:51)
root cause
javax.el.ELException: org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type @org.springframework.web.bind.annotation.PathVariable java.lang.Integer to type java.lang.String
Já tentei mudar a tipagem do meu modelo Produto para Integer e BigInteger mas sem sucesso. Já Criei um converter do Spring IntergerToString também sem sucesso.
Aqui meu modelo:
package br.com.casadocodigo.loja.model;
import java.util.Calendar;
import java.util.List;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.springframework.format.annotation.DateTimeFormat;
@Entity
public class Produto {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String titulo;
private String descricao;
private int paginas;
@DateTimeFormat
private Calendar dataLancamento;
private String sumarioPath;
@ElementCollection
private List<Preco> precos;
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public int getPaginas() {
return paginas;
}
public void setPaginas(int paginas) {
this.paginas = paginas;
}
@Override
public String toString() {
return "Produto [titulo=" + titulo + ", descricao=" + descricao + ", paginas=" + paginas + "]";
}
public List<Preco> getPrecos() {
return precos;
}
public void setPrecos(List<Preco> precos) {
this.precos = precos;
}
public Calendar getDataLancamento() {
return dataLancamento;
}
public void setDataLancamento(Calendar dataLancamento) {
this.dataLancamento = dataLancamento;
}
public String getSumarioPath() {
return sumarioPath;
}
public void setSumarioPath(String sumarioPath) {
this.sumarioPath = sumarioPath;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
Se alguém já passou por isso e conseguiu solucionar estaria enormemente agradecido se partilhasse a solução para futuros alunos.
Antes de me despedir, vou deixar aqui a minha solução quebra galho, deixar o link sem usar a tag do Spring:
<a href="produtos/detalhe/${produto.id }">${produto.titulo }</a>
Boas Aulas! Abs!