最近在回顾之前的后台项目时遇到很多奇奇怪怪的bug,其中一个bug就纠缠了我两天[○・`Д´・ ○],TM差点没被整晕。就是下面这个错误!!!
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'user_id' in 'class java.lang.Integer'
org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
com.sun.proxy.$Proxy14.selectOne(Unknown Source)
org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:166)
org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:82)
org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)
com.sun.proxy.$Proxy15.selectUser(Unknown Source)
jsoupdemo.service.impl.UserServiceImpl.selectUser(UserServiceImpl.java:20)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
明明以前的项目跑得好好的,复原一下就不行了
别人遇到的问题大多是:
对应的实体看看有没有对应的属性和对应的SET和GET方法!我这里是缺少对应的属性,也根本没有对应的SET和GET方法!
不过需要注意的是:在MyBatis映射文件中用"#"和$ 传递参数,其中#是以占位符的形式来传递对应变量的参数值的,框架会对传入的参数做预编译的动作,用$ 时会将传入的变量的参数值原样的传递过去,并且用$传递参数的时候需要有对应的GET方法,在MyBatis的映射文件中如果用某个变量传递传递参数,这个变量必须存在于对应的模型中,并且有对应的GET方法!此点常常引起莫名的异常问题,要多加注意!
或者mapper.xml中${}的参数名和实体类中对应的变量名不符也会出现no getter
的错误
然而?然而??然鹅!!!
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="jsoupdemo.mapper.IUserDAO">
<select id="selectUser" resultType="User" parameterType="int">
SELECT * FROM User WHERE user_id = ${user_id}
</select>
</mapper>
请问这位user_id
和xml中的user_id
有啥不同????试来试去死活就是不行
最终死马当作活马医用了个在Dao层指定Param的方法(我指我自己)
public interface IUserDAO {
User selectUser(@Param("user_id") int user_id);
}
成功了???!!!
奉劝遇到这个问题的各位什么法子都得试试,因为你根本不知道bug会在什么时候给你怀疑人生的一击!!!