1. 程式人生 > >There is no getter for property named 'XXX' in class 'aaa.bbb.ccc'(終極騷操作的解決方法)

There is no getter for property named 'XXX' in class 'aaa.bbb.ccc'(終極騷操作的解決方法)

rda col property pan 方法 style pack insert tro

  使用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

("username"),很正常,完美插入一條數據,於是大膽在原來的方法加上@Param("user"),運行,喲~竟然插入成功了,這是一個神奇的操作。

修改後的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'(終極騷操作的解決方法)