@ExcelIgnoreUnannotated 和 @AutoMapper 详解

1. @ExcelIgnoreUnannotated - Excel 导出控制注解

来源: cn.idev.excel.annotation.ExcelIgnoreUnannotated(基于 EasyExcel 的封装)

通俗理解: "默认忽略所有字段,只导出我明确标记的字段"


为什么需要这个注解?

想象一下,你有一个 OperatorVo 类,里面有 20 个字段:

复制代码
public class OperatorVo {
    private Long id;
    private String name;
    private String phone;
    private String email;
    private String department;
    private String position;
    private Date createTime;
    private Date updateTime;
    private String createBy;
    private String updateBy;
    // ... 还有 10 个字段
}

没有 @ExcelIgnoreUnannotated 时:

  • 导出 Excel 时,所有 20 个字段都会出现在表格里
  • 但你可能只想导出 idnamephone 这 3 个字段

有了 @ExcelIgnoreUnannotated 后:

  • 默认忽略所有字段
  • 只有你明确用 @ExcelProperty 标记的字段才会导出

实际使用示例
复制代码
@Data
@ExcelIgnoreUnannotated  // 默认忽略所有字段
public class OperatorVo implements Serializable {
    
    @ExcelProperty(value = "运维人员ID")  // ✅ 会导出
    private Long id;
    
    @ExcelProperty(value = "姓名")  // ✅ 会导出
    private String name;
    
    @ExcelProperty(value = "手机号")  // ✅ 会导出
    private String phone;
    
    private String email;  // ❌ 不会导出(没标记)
    private String department;  // ❌ 不会导出(没标记)
    private Date createTime;  // ❌ 不会导出(没标记)
}

导出的 Excel 表格只有 3 列:

运维人员ID 姓名 手机号
1 张三 13800138000
2 李四 13900139000

对比:不加 @ExcelIgnoreUnannotated
复制代码
@Data
// 没有 @ExcelIgnoreUnannotated
public class OperatorVo implements Serializable {
    
    @ExcelProperty(value = "运维人员ID")
    private Long id;
    
    private String name;  // ✅ 也会导出(默认行为)
    private String phone;  // ✅ 也会导出
    private String email;  // ✅ 也会导出
}

这样所有字段都会出现在 Excel 里,你控制不了哪些要导出、哪些不要导出。


2. @AutoMapper - 对象自动映射注解

来源: io.github.linpeilie.annotations.AutoMapper(MapStruct Plus 库)

通俗理解: "自动帮我做对象之间的属性复制"


为什么需要这个注解?

在开发中,你经常需要在不同对象之间转换数据:

复制代码
// 数据库实体类(对应数据库表)
public class Operator {
    private Long id;
    private String name;
    private String phone;
    private String email;
}

// 视图对象(返回给前端的数据)
public class OperatorVo {
    private Long id;
    private String name;
    private String phone;
    // Vo 不需要 email 字段
}

传统做法(手动转换):

复制代码
// 每次都要写这种重复代码
OperatorVo vo = new OperatorVo();
vo.setId(operator.getId());
vo.setName(operator.getName());
vo.setPhone(operator.getPhone());
// 字段多的时候,要写几十行...

有了 @AutoMapper 后:

复制代码
@Data
@AutoMapper(target = Operator.class)  // 告诉框架:这个 Vo 对应 Operator 实体
public class OperatorVo implements Serializable {
    private Long id;
    private String name;
    private String phone;
}

框架会自动生成转换代码,你只需要调用:

复制代码
// 一行代码搞定转换
OperatorVo vo = mapper.map(operator, OperatorVo.class);

实际工作流程
复制代码
数据库查询 → Operator 实体 → 自动转换 → OperatorVo → 返回给前端
                ↑                                      ↑
           @AutoMapper(target = Operator.class) 自动生成转换代码

3. 两个注解的组合使用

复制代码
@Data
@ExcelIgnoreUnannotated  // 控制 Excel 导出:只导出标记的字段
@AutoMapper(target = Operator.class)  // 控制对象转换:自动从 Operator 复制属性
public class OperatorVo implements Serializable {
    
    @ExcelProperty(value = "运维人员ID")  // Excel 导出 + 自动映射
    private Long id;
    
    @ExcelProperty(value = "姓名")  // Excel 导出 + 自动映射
    private String name;
    
    @ExcelProperty(value = "手机号")  // Excel 导出 + 自动映射
    private String phone;
    
    private String email;  // 不导出 Excel,但可以自动映射
    private String internalCode;  // 不导出 Excel,但可以自动映射
}

这样 OperatorVo 就有两个能力:

  1. 导出 Excel 时 :只导出标记了 @ExcelProperty 的字段
  2. 对象转换时 :自动从 Operator 实体复制同名属性

4. 总结对比

注解 作用 使用场景 效果
@ExcelIgnoreUnannotated 控制 Excel 导出 导出报表、下载数据 只导出明确标记的字段
@AutoMapper(target = XXX.class) 控制对象转换 实体类 ↔ Vo 类转换 自动生成属性复制代码

5. 实际开发

对于 Vo 类(View Object,视图对象):

复制代码
@Data
@ExcelIgnoreUnannotated  // ✅ 建议加:精确控制导出字段
@AutoMapper(target = Xxx.class)  // ✅ 建议加:自动转换
public class XxxVo implements Serializable {
    
    @ExcelProperty(value = "字段名")  // 需要导出时才加
    private String field1;
    
    private String field2;  // 不需要导出就不加 @ExcelProperty
}
相关推荐
·薯条大王4 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
ZJH__GO7 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆7 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光7 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林7 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
marvelyu8 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
AI人工智能+电脑小能手9 小时前
大白话说Java设计模式-04-工厂方法模式(业务实战篇)
java·设计模式·工厂方法模式·架构设计·代码解耦
BUG指挥官9 小时前
Sa-Token和Spring Security对比
java·后端·spring
小当家.1059 小时前
深入理解 ReAct Agent:从原理到 Java 实战
java·react.js·agent·react·架构设计·agent设计
geminigoth9 小时前
Spring AI Alibaba 入门开发一(备份)
java·人工智能·spring