Spring分页查询报Index 16 out of bounds for length 10异常解决
错误原因
报错java.lang.IndexOutOfBoundsException: Index 16 out of bounds for length 10的直接触发点是Controller里的测试日志代码:
你的分页配置默认每页查询10条数据,SQL层通过limit限制了每次最多返回10条记录,因此查询得到的boardList集合长度最多为10,合法索引范围是0~9。代码中硬编码调用boardList.get(16)访问索引为16的元素,超出了集合的实际长度,直接触发越界错误。
除此之外代码里还存在3个会影响分页功能正常运行的隐藏问题:
- 同一个请求里重复调用两次
service.getBoardListAll查库,浪费数据库性能 - MyBatis ResultMap映射配置错误:一对一关联错用了一对多的
collection标签,非主键字段错用了主键专属的id标签,会导致查询结果被错误合并,返回的列表长度和预期不符 - 帖子总数查询没有加社团ID过滤条件,后续计算分页页码时总数统计错误
修复步骤
- 移除非法的测试代码
直接删除Controller里的硬编码测试日志行:
如果需要调试打印列表内容,可以遍历集合输出,或者打印集合长度、合法索引范围内的元素,访问索引前最好先判断集合是否为空,避免空指针。log.info("@@@@@@@@@@@@"+boardList.get(16)+""); - 消除重复查库
已经把查询结果存到了boardList变量里,传给model的时候直接用这个变量即可,不需要再调用一次service查询:// 把原来的model.addAttribute("boardList", service.getBoardListAll(club_no, cri));替换成下面这行 model.addAttribute("boardList", boardList); - 修正MyBatis ResultMap配置
首先把非主键字段的映射标签从<id>改成<result>,<id>标签仅用于标记主键字段,供MyBatis判断数据重复;其次把一对一的对象关联从<collection>(一对多集合映射专用)改成<association>(单对象关联专用),修正后的配置参考:<resultMap type="MembersVo" id="membersMap"> <id property="member_no" column="member_no"/> <result property="member_email" column="member_email"/> <result property="member_pass" column="member_pass"/> <result property="member_name" column="member_name"/> <result property="member_location" column="member_location"/> <result property="member_tel" column="member_tel"/> <result property="member_image" column="member_image"/> <result property="member_regdate" column="member_regdate"/> <result property="member_updatedate" column="member_updatedate"/> <result property="member_authority" column="member_authority"/> <result property="member_signup_type" column="member_signup_type"/> <result property="member_status" column="member_status"/> <result property="member_role" column="member_role"/> <result property="member_type" column="member_type"/> </resultMap> <resultMap type="ClubBoardsVo" id="clubBoardsMap"> <id property="club_board_no" column="club_board_no"/> <result property="club_no" column="club_no"/> <result property="board_type_no" column="board_type_no"/> <result property="member_no" column="member_no"/> <result property="club_board_title" column="club_board_title"/> <result property="club_board_content" column="club_board_content"/> <result property="club_board_image" column="club_board_image"/> <result property="club_board_date" column="club_board_date"/> <result property="club_board_updatedate" column="club_board_updatedate"/> <result property="club_board_likecnt" column="club_board_likecnt"/> <result property="club_board_commentcnt" column="club_board_commentcnt"/> </resultMap> <resultMap type="BoardTotalBean" id="boardListMap"> <association property="membersVo" resultMap="membersMap"/> <association property="clubBoardsVo" resultMap="clubBoardsMap" /> </resultMap> - 修正总数查询逻辑
当前的总数查询没有加club_no过滤,统计的是全平台所有帖子的数量,不是当前访问社团下的帖子数,后续做分页导航栏的时候页码计算会出错,修改SQL加上过滤条件即可:
对应DAO层调用的时候记得把club_no参数一并传入总数查询的方法。<select id="totalBoardCnt" resultType="java.lang.Integer"> select count(club_board_no) from club_boards where club_no = #{club_no} </select>
内容的提问来源于stack exchange,提问作者heo
相关产品推荐
相关产品推荐

