There is no getter for property named 'XXX' in class 'aaa.bbb.ccc'(終極騷操作的解決方法)
使用SpringBoot整合Mybatis時,遇到了像標題的異常,博主當時是用Bean類對象作為參數的,所以百度了很久都沒有建設性答案。貼一下報錯的xxxDao文件和xxxMapper.xml文件:
package com.cjs.dao;
import com.cjs.bean.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.*;
@Mapper
public interface UserDao {
public int insertUser(User user);
}
<?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="com.cjs.dao.UserDao">
<insert id="insertUser" parameterType="user" >
insert into tb_users(username, loginname, password, phone, address)
values (#{user.username},#{user.loginname}, #{user.password}, #{user.phone}, #{user.address})
</insert>
</mapper>
嗯~按照常規SSM的操作,上面的代碼不會出異常的,但實際上就報了nested exception is org.apache.ibatis.reflection.ReflectionException的異常,完整的標題語句是There is no getter for property named ‘user‘ in class ‘com.cjs.bean.User‘,他的意思是在User對象裏沒有user的getter方法。什麽???(黑人問號.jpg)user是一個對象,怎麽會搞個getter方法進去?!於是博主又寫了一個簡單的方法,參數是一個String類型,按照優良編碼習慣,在Dao方法的參數上加上@Param
修改後的Dao文件代碼:
package com.cjs.dao;
import com.cjs.bean.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.*;
@Mapper
public interface UserDao {
public int insertUser(@Param("user") User user);
}
其實就是一個簡單的操作,現在來分析一下,加上@Param("user")是為了在XXXMapper.xml文件能夠準確找到該參數,parameterType="user",這裏的user是類型,表示傳進來的參數類型是user,其實是User對象,這裏設定了User的別名是user;#{user.username}這裏的user是參數名,問題就出在這裏了(敲黑板),在SpringBoot整合Mybatis裏面,如果不設置@Param("user"),它會把#{user.username}裏的user當作你傳進去的參數的一個屬性值,即變成了user.user.username,那麽User對象裏面自然沒有user屬性了,相反,我表明了#{user.username}裏的user就是我傳進去的參數,即標明@Param("user")。這種解決方法可以推廣到參數為非bean對象的情況。
按照剛才的分析,如果使用#{user.username},就要加@Param("user")來標記user參數,換句話說,如果不加,就把#{user.username}裏的user當作是參數裏的一個屬性(註意上面有下劃線的一句話),那麽這裏出現第二種修改方式:將#{user.username}換成#{username}
package com.cjs.dao;
import com.cjs.bean.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.*;
@Mapper
public interface UserDao {
public int insertUser(User user);
}
<?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="com.cjs.dao.UserDao">
<insert id="insertUser" parameterType="user">
insert into tb_users(username, loginname, password, phone, address)
values (#{username},#{loginname}, #{password}, #{phone}, #{address})
</insert>
</mapper>
There is no getter for property named 'XXX' in class 'aaa.bbb.ccc'(終極騷操作的解決方法)