websystique tutorial mvc example spring hibernate jsp spring-mvc el

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:

  1. getAllEmployees(searchName) método getAllEmployees(searchName) para devolver una List<Employee> real List<Employee> . Por lo general, esto se debe hacer consultando la entidad Employee directamente en lugar de columnas / campos invididuales.

  2. Reemplace todas las declaraciones incorrectas de List<Employee> por List<Object[]> y manipúlelo en EL como una matriz de objetos como ${employee[0]} , ${employee[1]} , etc.