为什么我的实体类中有个属性private String bLicense;在将名字修改为blicense之后才能把属性值导入到excel里,否则就为空呢。我这个类使用了@Data注解,我看见有人也遇到了同样的问题
[alibaba/easyexcel]实体类命名有规范吗
回答
以下基于easyexcel的2.2.6版本!
老铁,这个类,你使用了Lombok的@Data注解了吧,Lombok在第一个字母是小写,第二个字母是大写的情况下,和Idea,eclipse等生成的get-set方法不一样
Lombok生成的get-set方法@Data
public class ShopDto {
@ExcelProperty("商品名字")
private String tMallInfo;
}
class TestShop{
public void init(){
ShopDto shopDto = new ShopDto();
shopDto.setTMallInfo("");//注意,T被大写处理了
shopDto.getTMallInfo();
}
}
idea或者eclipse生成的get-set方法
public class ShopDto {
@ExcelProperty("商品名字")
private String tMallInfo;
public String gettMallInfo() {//注意t被小写处理了
return tMallInfo;
}
public void settMallInfo(String tMallInfo) {
this.tMallInfo = tMallInfo;
}
}
easyexcel底层给对象的属性赋值,使用的cglib,底层代码是:
com.alibaba.excel.read.listener.ModelBuildEventListener 类的第130行
BeanMap.create(resultModel).putAll(map);
最底层的是cglib的BeanMap的这个方法调用
abstract public Object put(Object bean, Object key, Object value);
//这个方法我没有找到实现,但是根据实验,我猜测啊,也是按照idea,eclipse,mybatis生成get-set的方法解析的!
之前碰到过这个坑,就是Lombok对于这种生成的get-set方法规则和idea,以及mybatis的解析规则不一样,推荐的解决方案是:
1.尽可能不要出现这种第一个字母是小写,第二个字母是大写的情况,前两个字母最好小写 2.如果是在是业务定义,那么对于这种特殊的字段,不要使用Lombok自动生成的get-set方法,自己使用idea生成的,非特殊的忽略
例如:我们是这么干
@Data
public class ShopDto {
@ExcelProperty("商品名字")
private String tMallInfo;
//非特殊的就使用lombok
@ExcelProperty("商品价格")
private Double price;
@ExcelProperty("描述信息")
private String describe;
//特殊的字段就使用Idea或者eclipse自动生成,覆盖lombok自动生成的get-set方法
public String gettMallInfo() {
return tMallInfo;
}
public void settMallInfo(String tMallInfo) {
this.tMallInfo = tMallInfo;
}
}
当然,最后如果easyexcel能适配,那最好!
这个问题和 #1467 一样!
谢谢您的认真回复,在火车上看到这封邮件,非常感谢。底层代码cglib我再看看。假期愉快哦,哈哈?
以下基于easyexcel的2.2.6版本!
老铁,这个类,你使用了Lombok的@DaTa注解了吧,Lombok在第一个字母是小写,第二个字母是大写的情况下,和Idea,eclipse等生成的get-set方法不一样
Lombok生成的get-set方法@Data public class ShopDto { @ExcelProperty("商品名字") private String tMallInfo; } class TestShop{ public void init(){ ShopDto shopDto = new ShopDto(); shopDto.setTMallInfo("");//注意,T被大写处理了 shopDto.getTMallInfo(); } }
idea或者eclipse生成的get-set方法public class ShopDto { @ExcelProperty("商品名字") private String tMallInfo; public String gettMallInfo() {//注意t被小写处理了 return tMallInfo; } public void settMallInfo(String tMallInfo) { this.tMallInfo = tMallInfo; } } easyexcel底层给对象的属性赋值,使用的cglib,底层代码是: com.alibaba.excel.read.listener.ModelBuildEventListener 类的第130行 BeanMap.create(resultModel).putAll(map); 最底层的是cglib的BeanMap的这个方法调用 abstract public Object put(Object bean, Object key, Object value); //这个方法我没有找到实现,但是根据实验,我猜测啊,也是按照idea,eclipse,mybatis生成get-set的方法解析的! 之前碰到过这个坑,就是Lombok对于这种生成的get-set方法规则和idea,以及mybatis的解析规则不一样,推荐的解决方案是:
1.尽可能不要出现这种第一个字母是小写,第二个字母是大写的情况,前两个字母最好小写
2.如果是在是业务定义,那么对于这种特殊的字段,不要使用Lombok自动生成的get-set方法,自己使用idea生成的,非特殊的忽略
例如:我们是这么干
@Data public class ShopDto { @ExcelProperty("商品名字") private String tMallInfo; //非特殊的就使用lombok @ExcelProperty("商品价格") private Double price; @ExcelProperty("描述信息") private String describe; //特殊的字段就使用Idea或者eclipse自动生成,覆盖lombok自动生成的get-set方法 public String gettMallInfo() { return tMallInfo; } public void settMallInfo(String tMallInfo) { this.tMallInfo = tMallInfo; } }
当然,最后如果easyexcel能适配,那最好!