[alibaba/easyexcel]实体类命名有规范吗

2024-05-17 747 views
1

为什么我的实体类中有个属性private String bLicense;在将名字修改为blicense之后才能把属性值导入到excel里,否则就为空呢。我这个类使用了@Data注解,我看见有人也遇到了同样的问题

回答

8

以下基于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能适配,那最好!

3

这个问题和 #1467 一样!

6

谢谢您的认真回复,在火车上看到这封邮件,非常感谢。底层代码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能适配,那最好!