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

本文解析了在SpringBoot结合Mybatis进行数据库操作时,遇到的参数传递异常问题。详细介绍了如何正确使用@Param注解,以及在XML映射文件中如何正确引用参数,避免出现反射异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

转载于:https://www.cnblogs.com/SysoCjs/p/9880223.html

这个问题看起来是在尝试访问Java的String类中的一个属性(名为"month"),但是Java的String类中并没有这个属性。在Java中,String类没有提供名为"month"的属性或方法。如果你想获取月份,你可能需要使用java.time包中的LocalDate类或者使用循环或其他方式手动提取出日期字符串中的月份信息。 如果你的目的是从某个特定格式的日期字符串中提取月份,那么你可以通过编程的方式手动解析出这个信息。下面是一个基本的例子: ```java public class DateParser { public static void main(String[] args) { String dateString = "your_date_string"; int month = extractMonth(dateString); System.out.println("Month: " + month); } public static int extractMonth(String dateString) { String[] parts = dateString.split("/"); // 假设日期格式为"day/month/year" return Integer.parseInt(parts); // 返回月份部分 } } ``` 在这个例子中,我们假设日期字符串的格式是"day/month/year",并且我们通过分割字符串的方式提取出月份部分。这种方法对于一些常见日期格式应该是有效的,但并不是所有的日期字符串都可以这样解析。对于更复杂的日期格式,你可能需要使用更复杂的解析逻辑。 如果你的需求是在特定的环境下,例如你在使用某种特定框架或者库,并且有获取月份的方法,那么请提供更多的信息,我将很高兴为你提供更具体的帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值