eclipse生成setter,getter方法的一个bug:java.beans.IntrospectionException: Method not fou

本文介绍了在使用PropertyDescriptor类过程中遇到的IntrospectionException异常,并详细解释了如何根据JavaBeans规范正确地命名getter和setter方法。
今天做项目的过程中使用到了PropertyDescriptor这个类,但是在查找属性的时候却出现

java.beans.IntrospectionException: Method not found:isMBuyPrice

这是怎么回事呢?我的setter和getter都是eclipse自动生成的啊?
原来是这样的,eclipse的生成工具遇到这样的:mBuyPrice属性的时候生成的方法如下:

public String getmBuyPrice() {
return mBuyPrice;
}
public void setmBuyPrice(String mBuyPrice) {
this.mBuyPrice = mBuyPrice;
}

大家都知道,按照JavaBean的规范,这个是错误的。正确的如下:

public String getMBuyPrice() {
return mBuyPrice;
}
public void setMBuyPrice(String mBuyPrice) {
this.mBuyPrice = mBuyPrice;
}

记录一下,以备以后参考。
### ###问题分析 在使用 EasyExcel 导入 Excel 文件时,如果字段映射为 `null` 并抛出 `java.beans.IntrospectionException: java.lang.Object not superclass of java.lang.Object` 异常,则通常表明 Java Beans 内省机制在解析实体类属性时遇到了问题。该异常可能由以下原因导致: #### ###JavaBeans 内省失败的原因 JavaBeans 规范要求类必须遵循一定的命名规范,尤其是 gettersetter 方法的命名必须符合 `getXxx()` 或 `setXxx()` 的格式。若类中使用了链式调用(如 `@Accessors(chain = true)`),setter 方法将返回当前对象实例而非 `void`,这会导致内省过程无法正确识别属性类型和赋值方式,从而引发 `IntrospectionException`。 此外,某些 IDE 或 Lombok 插件生成的代码可能存在兼容性问题,例如未显式声明构造方法或字段访问权限控制不当,也可能导致此类异常[^1]。 --- #### ###EasyExcel 字段映射为 null 的常见情况 即使表头与字段名称完全匹配,字段仍可能映射为 `null`。这通常是因为 EasyExcel 在反射设置字段值时未能成功执行,尤其是在以下场景中: - 实体类使用了 `@Accessors(chain = true)` 注解 - 字段类型不匹配(如字符串映射到数字类型) - 没有提供默认构造函数 - 使用了非标准的 getter/setter 方法名 - 自定义转换器未正确实现 --- ### ###解决方案 #### 修复实体类设计以避免 IntrospectionException 确保实体类遵循 JavaBeans 规范,避免使用 `@Accessors(chain = true)`,或手动提供符合规范的 setter 方法。例如: ```java @Data public class Employee { @ExcelProperty("员工姓名") private String employeeName; public void setEmployeeName(String employeeName) { this.employeeName = employeeName; } @ExcelProperty("企业ID") private String enterpriseId; public void setEnterpriseId(String enterpriseId) { this.enterpriseId = enterpriseId; } } ``` 上述代码确保了每个字段都有标准的 setter 方法,避免因链式调用导致内省失败的问题。 --- #### 启用日志调试以定位字段映射问题 启用 EasyExcel 的调试日志功能,有助于观察字段映射过程中的具体行为。可将日志级别设为 `DEBUG` 或 `TRACE`,以便发现字段赋值失败的具体位置。 ```properties logging.level.com.alibaba.easyexcel = DEBUG ``` 通过日志输出可以确认是否由于数据类型不匹配、空值处理或自定义转换器错误而导致字段映射失败。 --- #### 使用自定义监听器进行字段校验 可通过实现 `AnalysisEventListener` 接口,在每次读取行数据后对字段进行校验,及时发现字段为 `null` 的问题: ```java public class CustomReadListener extends AnalysisEventListener<Employee> { @Override public void invoke(Employee data, AnalysisContext context) { if (data.getEmployeeName() == null) { System.out.println("第 " + context.readRowHolder().getRowIndex() + " 行员工姓名为空"); } } @Override public void doAfterAllAnalysed(AnalysisContext context) { System.out.println("所有数据解析完成"); } } ``` --- #### 避免使用非标准构造函数 确保实体类包含无参构造函数,否则可能导致 EasyExcel 反射创建实例失败。Lombok 的 `@NoArgsConstructor` 注解可用于简化此操作: ```java @Data @NoArgsConstructor @AllArgsConstructor public class Employee { @ExcelProperty("员工姓名") private String employeeName; @ExcelProperty("企业ID") private String enterpriseId; } ``` --- #### 显式配置字段映射关系 若存在动态列或复杂映射需求,建议使用 `registerConverter` 显式注册字段转换器,以确保数据能正确映射到目标字段。 ```java EasyExcel.read(fileName, Employee.class, new CustomReadListener()) .registerConverter(new StringToIntegerConverter()) .sheet() .doRead(); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值