【问题标题】:${employee.id} from List in JSP throws java.lang.NumberFormatException: For input string: "id"${employee.id} from List in JSP throws java.lang.NumberFormatException: For input string: "id"
【发布时间】:2016-05-26 14:51:08
【问题描述】:

我有一个 JSP 页面,当在 <c:forEach> 中从下面的方法中显示 List<Employee> 时工作正常。

@RequestMapping(value = { "getAllEmployees", "/" })
public ModelAndView getAllEmployees() {
    // logger.info("Getting the all Employees.");
    List<Employee> employeeList = employeeService.getAllEmployees();
    return new ModelAndView("employeeList", "employeeList", employeeList);
}

而同一个 JSP 在从下面的方法中显示 List&lt;Employee&gt; 时会引发异常。

@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);
}

这是堆栈跟踪:

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)

这是怎么引起的,我该如何解决?

【问题讨论】:

  • 添加错误信息会让您更轻松。
  • @Lukehey 添加错误
  • 接下来请看你的看法。尝试包含所有信息,因为您的映射显然可以正常工作。

标签: spring hibernate jsp spring-mvc el


【解决方案1】:

您的getAllEmployees(searchName) 方法不会返回List&lt;Employee&gt;,而是返回List&lt;Object[]&gt;。很可能还有一个由编译器生成的“未经检查的强制转换”警告,您忽略或抑制了它。

证据是javax.el.ArrayELResolver 参与了堆栈跟踪。这仅在 EL 表达式的基数是数组类型时才涉及。如果你真的有一个Employee 而不是Object[],那么你会期望javax.el.BeanELResolver 在特定的堆栈跟踪行中,其中将评估EL 表达式${employee.id}。由于${employee} 在您的情况下实际上是一个数组,EL 会将id 属性解释为数组索引,然后尝试将其解析为Integer,但未能如您在顶部行中看到的那样堆栈跟踪。

要解决此问题,您有 2 个选择:

  1. 修复 getAllEmployees(searchName) 方法以返回 真实 List&lt;Employee&gt;。通常,这是通过直接查询Employee 实体而不是单个列/字段来完成的。

  2. 将所有不正确的List&lt;Employee&gt; 声明替换为List&lt;Object[]&gt;,并在EL 中将其作为对象数组处理,如${employee[0]}${employee[1]} 等。

【讨论】:

    猜你喜欢
    • 2021-03-21
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2020-05-27
    • 2016-09-24
    • 2019-07-18
    • 2022-01-16
    • 2016-01-12
    相关资源
    最近更新 更多