example - tutorial crud spring mvc
${employee.id} de la Lista en JSP arroja java.lang.NumberFormatException: Para la cadena de entrada: "id" (1)
Tengo una página JSP que funciona bien cuando se muestra el método
List<Employee>
desde abajo en un
<c:forEach>
.
@RequestMapping(value = { "getAllEmployees", "/" })
public ModelAndView getAllEmployees() {
// logger.info("Getting the all Employees.");
List<Employee> employeeList = employeeService.getAllEmployees();
return new ModelAndView("employeeList", "employeeList", employeeList);
}
Mientras que el mismo JSP arroja una excepción al mostrar
List<Employee>
del siguiente método.
@RequestMapping("searchEmployee")
public ModelAndView searchEmployee(@RequestParam("searchName") String searchName) {
// logger.info("Searching the Employee. Employee Names: " + searchName);
List<Employee> employeeList = employeeService.getAllEmployees(searchName);
System.err.println("Employee count = "+employeeList.size());
return new ModelAndView("employeeList", "employeeList", employeeList);
}
Aquí está el seguimiento de la pila:
java.lang.NumberFormatException: For input string: "id"
java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
java.lang.Integer.parseInt(Integer.java:492)
java.lang.Integer.parseInt(Integer.java:527)
javax.el.ArrayELResolver.coerce(ArrayELResolver.java:151)
javax.el.ArrayELResolver.getValue(ArrayELResolver.java:64)
org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:110)
org.apache.el.parser.AstValue.getValue(AstValue.java:169)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:184)
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:943)
org.apache.jsp.WEB_002dINF.pages.employeeList_jsp._jspx_meth_c_005fout_005f0(employeeList_jsp.java:358)
org.apache.jsp.WEB_002dINF.pages.employeeList_jsp._jspx_meth_c_005fforEach_005f0(employeeList_jsp.java:312)
org.apache.jsp.WEB_002dINF.pages.employeeList_jsp._jspx_meth_c_005fif_005f1(employeeList_jsp.java:273)
org.apache.jsp.WEB_002dINF.pages.employeeList_jsp._jspService(employeeList_jsp.java:162)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:168)
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:966)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
¿Cómo se causa esto y cómo puedo resolverlo?
Su
getAllEmployees(searchName)
no devuelve una
List<Employee>
, sino una
List<Object[]>
.
Lo más probable es que también haya una advertencia de "lanzamiento no verificado" generada por el compilador que ignoró o suprimió.
La evidencia es la participación de
javax.el.ArrayELResolver
en el seguimiento de la pila.
Esto solo está involucrado cuando la base de una expresión EL es de un tipo de matriz.
Si realmente tuviera un
Employee
lugar de un
Object[]
, entonces esperaría
javax.el.BeanELResolver
en la línea de seguimiento de la pila particular donde se evaluará la expresión EL
${employee.id}
.
Como
${employee}
es en su caso en realidad una matriz, EL interpretará la propiedad
id
como un índice de matriz y luego intenta analizarla como un
Integer
, pero no pudo hacerlo, como puede ver en las líneas superiores de la traza de la pila.
Para resolver este problema, tienes 2 opciones:
-
getAllEmployees(searchName)
métodogetAllEmployees(searchName)
para devolver unaList<Employee>
realList<Employee>
. Por lo general, esto se debe hacer consultando la entidadEmployee
directamente en lugar de columnas / campos invididuales. -
Reemplace todas las declaraciones incorrectas de
List<Employee>
porList<Object[]>
y manipúlelo en EL como una matriz de objetos como${employee[0]}
,${employee[1]}
, etc.