今天在用maven+SSM做酒店管理系统的一个功能模块的开始阶段,遇到一个bug,下面把我遇到的这个bug以及解决的方法分享给大家,以供参考。
- 页面显示状态码:500
- 错误信息:
Message Request processing failed; nested exception is org.apache.ibatis.builder.IncompleteElementException: Could not find result map com.kgc.mapper.InRoomInfoMapper.Map - 具体bug信息如下:
HTTP Status 500 – Internal Server Error
Message Request processing failed; nested exception is org.apache.ibatis.builder.IncompleteElementException: Could not find result map com.kgc.mapper.InRoomInfoMapper.Map
Description The server encountered an unexpected condition that prevented it from fulfilling the request.
Exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.apache.ibatis.builder.IncompleteElementException: Could not find result map com.kgc.mapper.InRoomInfoMapper.Map
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Root Cause
org.apache.ibatis.builder.IncompleteElementException: Could not find result map com.kgc.mapper.InRoomInfoMapper.Map
org.apache.ibatis.builder.MapperBuilderAssistant.getStatementResultMaps(MapperBuilderAssistant.java:346)
org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(MapperBuilderAssistant.java:290)
org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode(XMLStatementBuilder.java:109)
org.apache.ibatis.session.Configuration.buildAllStatements(Configuration.java:775)
org.apache.ibatis.session.Configuration.hasStatement(Configuration.java:745)
org.apache.ibatis.session.Configuration.hasStatement(Configuration.java:740)
org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:217)
org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:48)
org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:65)
org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:58)
com.sun.proxy.$Proxy19.getInRoomInfos(Unknown Source)
com.kgc.service.impl.InRoomInfoServiceImpl.findInRoomInfo(InRoomInfoServiceImpl.java:18)
com.kgc.controller.InRoomInfoController.getInRoomInfos(InRoomInfoController.java:22)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:116)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
- 解决思路:
- 第一步:可能是spring管理mybatis的配置文件出了问题。 一般就是实体类配置文件关联相应的映射文件即mapperLocations属性必须要配置。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--dataSource属性指定要用到的连接池 ref映射的是id=dataSource的bean标签,读取连接数据库信息-->
<property name="dataSource" ref="dataSource"/>
<!--configLocation属性指定mybatis的核心配置文件,管理mybatis配置文件-->
<property name="configLocation" value="classpath:mybatis/sqlMapConfig.xml"/>
<!-- 所有配置的mapper文件,mybatis的实体类配置文件所有的sql映射文件 -->
<property name="mapperLocations" value="classpath:mybatis/mapper/*.xml"></property>
</bean>
- 第二步:映射文件的结果集是Map类型,我考虑是否跟别名没有配置的关系,所以在myBatis配置文件中完善了别名的配置。
- 备注:mybais中基本数据类型及其包装类以及map都默认配置别名,不需要我们配,像List,pojo类需要我们配置别名。
<!--配置别名-->
<typeAliases>
<typeAlias type="java.util.List" alias="list"></typeAlias>
<package name="com.kgc"></package>
</typeAliases>
- 第三步:映射文件的结果集类型出错(也就是我出错的位置)
- 错误配置:
<!--映射文件配置-->
<mapper namespace="com.kgc.mapper.InRoomInfoMapper">
<select id="getInRoomInfos" resultMap="Map">
SELECT * FROM in_room_info
</select>
</mapper>
- 正确配置:
<mapper namespace="com.kgc.mapper.InRoomInfoMapper">
<select id="getInRoomInfos" resultType="Map">
SELECT * FROM in_room_info
</select>
</mapper>
-
错误原因:由于我在用maven+SSM搭建完环境后做简单的测试,用的是一张表,返回的结果集应该是Map集合,但返回类型应该是resultType。
补充:resultType和resultMap的用法是有区别的?
-
resultType表示返回类型,包括基本数据类型和复杂数据类型。
-
resultMap是对外部resultMap定义的引用,对应外部resultMap的id,表示返回结果映射到哪一个resultMap上。
-
简单的来讲,就是单表查询返回的结果集使用resultType,多表联合查询的结果集使用resultMap。