ModelAndView抛出NumberFormatException且无法加载JSP页面的原因
看起来你遇到的问题根源是JSP中对集合对象的访问方式错误,导致EL表达式把属性名housePrice当成了要转换的数值,从而触发NumberFormatException。
问题分析
错误日志里明确显示"For input string: 'housePrice'",说明代码试图把字符串housePrice转换成数字,但它本身是实体类的属性名,不是数值。大概率是你在Controller里把一个List集合(比如List<HousePrice>)放到了ModelAndView中,命名为housepricesList,但在JSP里直接用${housepricesList.housePrice}访问——List本身并没有housePrice这个属性,这种错误的访问方式导致容器把属性名当成了值来处理,最终触发转换异常。
解决方案
1. 确认Controller中的数据传递是否正确
确保你在Controller里存入Model的是一个合法的实体列表,实体类有housePrice属性和对应的getter方法(符合JavaBean规范):
// 示例Controller代码 @RequestMapping("/calculate") public ModelAndView calculateHousePrices() { // 模拟计算得到的房价列表 List<HousePrice> housePricesList = new ArrayList<>(); housePricesList.add(new HousePrice(1000000.0)); housePricesList.add(new HousePrice(1500000.0)); ModelAndView mav = new ModelAndView("result.jsp"); mav.addObject("housepricesList", housePricesList); // 存入列表 return mav; } // 对应的实体类HousePrice public class HousePrice { private Double housePrice; public HousePrice(Double housePrice) { this.housePrice = housePrice; } // 必须有getter方法,EL表达式依赖它获取属性值 public Double getHousePrice() { return housePrice; } }
2. 修正JSP中的访问逻辑
因为housepricesList是一个集合,你需要用<c:forEach>标签遍历它,逐个获取每个实体的housePrice属性:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!-- 遍历房价列表 --> <c:forEach items="${housepricesList}" var="priceItem"> <!-- 正确访问单个实体的housePrice属性 --> 房价:<c:out value="${priceItem.housePrice}"/><br/> </c:forEach>
如果你的需求是显示单个房价(不是列表),那要检查Controller里是否误把List当成单个对象存入Model,或者变量名写错了——比如应该存入mav.addObject("housePriceObj", singleHousePrice);,然后在JSP里用${housePriceObj.housePrice}访问。
额外注意点
如果你在JSP中使用了格式化标签(比如<fmt:formatNumber>),也要确保传入的是数值属性,而不是错误的集合访问表达式:
<!-- 正确用法 --> <fmt:formatNumber value="${priceItem.housePrice}" pattern="#,##0.00"/>
内容的提问来源于stack exchange,提问作者Degsy

