Mybatis出错: Cause: org.apache.ibatis.reflection.ReflectionException: Error instantiating class com.cy...
时间: 2023-07-19 11:54:53 AIGC 浏览: 195
这个错误可能由多种原因引起,以下是几种可能的原因和解决方法:
1. 检查Mybatis配置文件中的mapper是否正确配置。确保文件路径和命名空间与实际情况相符。
2. 检查mapper接口和xml中的方法名是否一致。如果不一致,Mybatis会无法找到对应的方法,从而导致实例化类失败。
3. 检查mapper接口的包路径是否正确。如果包路径不正确,Mybatis会无法找到对应的mapper接口,从而导致实例化类失败。
4. 检查mapper接口和xml中的参数是否一致。如果参数不一致,Mybatis会无法找到对应的方法,从而导致实例化类失败。
如果以上方法都无法解决问题,建议检查一下具体的异常信息,以便更好地排查问题。
相关问题
Exception in thread "main" org.mybatis.spring.MyBatisSystemException: ### Error updating database. Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'birth' in 'class com.li.demo011.bean.Vip' ### The error may exist in file [D:\work\code\demo-011\target\classes\mapper\VipMapper.xml] ### The error may involve com.li.demo011.repository.VipMapper.insert-Inline ### The error occurred while setting parameters ### SQL: insert into t-vip(id,name,card_number,birth) values(null,?,?,?) ### Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'birth' in 'class com.li.demo011.bean.Vip' at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:99) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:347) at jdk.proxy2/jdk.proxy2.$Proxy47.insert(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:224) at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:62) at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:141) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86) at jdk.proxy2/jdk.proxy2.$Proxy48.insert(Unknown Source) at com.li.demo011.service.VipServiceImpl.save(VipServiceImpl.java:17) at com.li.demo011.Demo011Application.main(Demo011Application.java:18) Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'birth' in 'class com.li.demo011.bean.Vip' at org.apache.ibatis.reflection.Reflector.getGetInvoker(Reflector.java:385) at org.apache.ibatis.reflection.MetaClass.getGetInvoker(MetaClass.java:160) at org.apache.ibatis.reflection.wrapper.BeanWrapper.getBeanProperty(BeanWrapper.java:156) at org.apache.ibatis.reflection.wrapper.BeanWrapper.get(BeanWrapper.java:50) at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:115) at org
### 解决 MyBatis 中因缺少 getter 方法导致的 ReflectionException 异常
当遇到 `org.apache.ibatis.reflection.ReflectionException` 异常提示“no getter for property named 'birth' in class com.li.demo01.bean.vip”,这通常表明 MyBatis 尝试映射数据库字段到 Java 对象属性时失败,因为指定的属性名在目标类中不存在或者未定义相应的 getter 和 setter 方法。
以下是可能的原因以及解决方案:
#### 可能原因分析
1. **属性名称不匹配**
如果 SQL 查询返回的结果集中的列名与实体类中的属性名不同,则会引发此错误。MyBatis 默认通过属性名来查找对应的 getter/setter 方法[^1]。
2. **缺少 Getter/Setter 方法**
即使实体类中有该属性,但如果未提供标准的 getter 或者 setter 方法(遵循 JavaBean 规范),也会抛出此类异常。
3. **SQL 配置问题**
在 `<resultMap>` 中如果指定了错误的 column 属性或 property 属性,也可能触发这个异常。
---
#### 解决方案
##### 1. 检查实体类结构
确认 `com.li.demo01.bean.vip` 类是否存在名为 `birth` 的属性及其对应的标准 getter 和 setter 方法。例如:
```java
public class Vip {
private String birth; // 假设数据类型为String
public String getBirth() { // 标准Getter方法
return birth;
}
public void setBirth(String birth) { // 标准Setter方法
this.birth = birth;
}
}
```
如果没有上述方法,请按照 JavaBean 规范补充实现。
##### 2. 映射配置校验
检查 MyBatis XML 文件中的 `<resultMap>` 定义部分,确保 column 和 property 名称一致。例如:
```xml
<resultMap id="VipResultMap" type="com.li.demo01.bean.Vip">
<result column="birthday_column_name_in_db" property="birth"/>
</resultMap>
```
这里需要注意两点:
- 数据库表中的实际列名应替换掉 `"birthday_column_name_in_db"`;
- 实体类中的属性名应当是 `"birth"` 并且有相应的方法支持访问它。
##### 3. 使用别名调整查询结果
如果无法修改数据库表设计而仅希望改变程序端逻辑的话,可以在 SQL 查询语句里利用 AS 关键字给字段起个别名使其符合预期的名字形式。比如这样写 SELECT 子句的一部分:
```sql
SELECT user_birth as birth FROM users ...
```
如此一来即使原始列叫做 `user_birth`, 返回的数据集中就会显示成 `birth`.
---
### 总结
通过对以上几个方面的核查可以有效定位并修复由反射机制引起的 No Getter For Property Named 错误。务必保证 Bean 结构清晰合理、Mapper 文件书写无误以及最终传递至框架处理前后的参数保持一致性。
org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'account' in 'class com.example.springboot.entity.User' at org.apache.ibatis.reflection.Reflector.getGetInvoker(Reflector.java:387) ~[mybatis-3.5.11.jar:3.5.11] at org.apache.ibatis.reflection.MetaClass.getGetInvoker(MetaClass.java:164) ~[mybatis-3.5.11.jar:3.5.11] at org.apache.ibatis.reflection.wrapper.BeanWrapper.getBeanProperty(BeanWrapper.java:162) ~[mybatis-3.5.11.jar:3.5.11] at org.apache.ibatis.reflection.wrapper.BeanWrapper.get(BeanWrapper.java:49) ~[mybatis-3.5.11.jar:3.5.11] at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:122) ~[mybatis-3.5.11.jar:3.5.11]
这个异常表示在 com.example.springboot.entity.User 类中没有名为 account 的属性的 getter 方法。请检查 User 类的代码,确保它有一个名为 account 的属性,并且有一个公共的 getter 方法,如下所示:
```java
public class User {
private String account;
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
//其他属性和方法
}
```
如果您已经定义了 getter 方法但仍然收到此异常,请确保 getter 方法的名称与属性名称完全匹配,并且 getter 方法的访问修饰符为 public。
阅读全文
相关推荐















