Spring MyBatis解析clubMapper.xml失败 无法找到boardContentMap
问题根因
- 直接导致启动报错的原因:
getBoardContent查询节点错误使用resultType属性引用自定义resultMap。
MyBatis的属性规则中,resultType用于指定返回结果对应的Java类型(接收全限定类名、已注册的类型别名),只有resultMap属性才会通过id匹配预先定义的<resultMap>节点。你配置了resultType="boardContentMap"后,MyBatis会把boardContentMap识别为类型别名,去扫描路径下找名为boardContentMap的Java类,找不到就抛出ClassNotFoundException,最终导致Spring上下文加载失败。 - 隐藏的映射逻辑错误:
BoardTotalBean中的membersVo、clubBoardsVo、clubsVo都是单对象属性,并非List/Set等集合类型,但你在boardListMap、boardContentMap中都使用了<collection>标签做映射。<collection>是专门用来映射一对多的集合属性的,单对象关联映射应该使用<association>标签,就算解决启动报错,运行时查询结果也会封装异常。
修复方案
- 修正
getBoardContent节点的属性配置,将错误的resultType替换为resultMap:
<!-- 原错误配置 <select id="getBoardContent" resultType="boardContentMap"> --> <select id="getBoardContent" resultMap="boardContentMap"> select c.club_name, b.board_type_no, m.member_name, m.member_image, b.club_board_title, b.club_board_content, b.club_board_image, b.club_board_date, b.club_board_updatedate from club_boards b join clubs c on (b.club_no = c.club_no) join members m on (b.member_no = m.member_no) where club_board_no = #{club_board_no} </select>
- 修正两个resultMap的映射标签,将单对象属性对应的
<collection>替换为<association>:
修正boardListMap:
<resultMap type="BoardTotalBean" id="boardListMap"> <association property="membersVo" resultMap="membersMap"/> <association property="clubBoardsVo" resultMap="clubBoardsMap" /> </resultMap>
修正boardContentMap:
<resultMap type="BoardTotalBean" id="boardContentMap"> <association property="clubBoardsVo" resultMap="clubBoardsMap"></association> <association property="clubsVo" resultMap="clubsMap"></association> <association property="membersVo" resultMap="membersMap"></association> </resultMap>
- 配置校验:确认MyBatis已注册
com.joinus.domain包下类的类型别名,否则resultMap中写的短类名(如MembersVo、BoardTotalBean)也会触发类型找不到的错误。
如果是独立mybatis-config.xml配置,添加如下节点:
<typeAliases> <package name="com.joinus.domain"/> </typeAliases>
如果是Spring整合MyBatis场景,在SqlSessionFactory的bean配置中添加typeAliasesPackage属性,值设为com.joinus.domain即可。
内容的提问来源于stack exchange,提问作者heo
相关产品推荐
相关产品推荐

