@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
}
相关推荐
愚公移码6 小时前
蓝凌EKP18产品:流程虚拟机(PVM)
java·开发语言·前端
驰骋工作流6 小时前
流程引擎BPM设计之:流程消息
java·工作流引擎·bpm·jflow·ccflow
dogstarhuang6 小时前
从 0 到 1 搭建可收费的 API 开放平台(实战)
java·架构·api
VortMall7 小时前
『平台去经营化』平台治理能力全新重构|VortMall微服务商城系统v1.3.10
java·大数据·微服务·商城系统·开源商城·vortmall·去经营化
吴声子夜歌7 小时前
Redis 3.x——集群故障转移
java·数据库·redis·集群
Java面试题总结7 小时前
mybatis插件
java·tomcat·mybatis
橘子海全栈攻城狮8 小时前
【最新源码】基于SpringBoot + Vue的超市管理系统的设计与实现D002
java·开发语言·vue.js·spring boot·后端·spring
smartvxworks8 小时前
Linux 实时内核(Linux Real-Time Kernel)详解:原理、实践与优化
java·linux·服务器
qizayaoshuap8 小时前
# [特殊字符] 密码生成器 — 鸿蒙ArkTS安全算法与密码强度评估系统
java·算法·安全·华为·harmonyos