1. 问题
下午测试一个get接口时,mybatis一直报错,有如下两个异常信息:
- MyBatisSystemException with kryo’s ClassLoader. Retrying with current
- Expected one result to be returned by selectone(),but found 344
本身入参是一个id,查出来的数据应该是一个,但是此时提示查出表中所有的数据,所以报异常了。
2. 代码业务
- 数据库语句,so easy
@Override
public AccessPolicyAnalysisResult get(AccessPolicyAnalysisResult model) throws ServiceException {
return super.get(model);
}
- mybatis对应的xml语句
<select id="get" resultType="AccessPolicyAnalysisResult">
<include refid="access_policy_analysis_mapping_column"/>
<where>
<if test="globalId != null ">
and global_id = #{globalId}
</if>
<if test="applyId != null ">
and apply_id = #{applyId}
</if>
</where>
limit 1
</select>
3. 定位思路
- 首先当然是检查代码,但是未发现异常;
- 手动执行sql语句,可以正常查出一条数据;
- 因为公司的框架,log设置成debug,就可以打印sql语句了。所以修改成debug,发现什么log都没有,正常的业务log也没有。此时感觉可能和环境有关。
- 重启idea,项目没有自动加载,然后手动导入项目,配置maven、jdk,再次启动tomcat,问题解决。
4. 问题原因
我在调试这个接口之前,修改了一下mapper.xml配置文件,因为我的入参是applyId不是主键,所以我添加了上面sql语句中的如下内容:
<if test="applyId != null ">
and apply_id = #{applyId}
</if>
增加这个判断之后,并没有重新编译项目,直接启动tomcat,导致tomcat并没有加载到变更。此时通过applyId查找不到特定的那条数据,故出现以上异常。
5. 问题总结
问题不复杂,但是耽误了一些时间;教训就是,遇到问题要多思考,尤其是这种感觉代码没有问题的时候,可以想想外观因素。不能盲目的一直定位代码问题。