There is no getter for property named 'XXX' in class 'aaa.bbb.ccc'(终极骚操作的解决方法)

Posted sysocjs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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("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'(终极骚操作的解决方法)的主要内容,如果未能解决你的问题,请参考以下文章

mybatis出现There is no getter for property named ...的原因及解决办法

There is no getter for property named 'NULL' in ……

Mybatis单个参数报错: There is no getter for property named

Mybatis单个参数报错: There is no getter for property named

Mybatismybatis查询报错org.apache.ibatis.reflection.ReflectionException: There is no getter for propert(代

Mybatis单个参数的if判断(针对异常:There is no getter for property..)------mybatis的内置对象