@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 个字段都会出现在表格里
  • 但你可能只想导出 id、name、phone 这 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 分钟前
【AI全栈后端12-08】Spring Boot 用 MCP 统一接入内部系统:让 AI 接一次,全公司复用
java·人工智能·spring boot
顽疲12 分钟前
从零用 Java 实现小红书 SpringBoot Vue UniApp(23)笔记话题多对多:一条笔记进多个话题池
java·vue.js·spring boot
木井巳26 分钟前
【BFS 解决拓扑排序】课程表
java·算法·leetcode·广度优先·宽度优先·推荐算法·图搜索算法
Crazy________37 分钟前
05Linux内存管理核心原理与运维实战
java·开发语言
Nebula_g39 分钟前
JavaSE拓展:工具类Executors
java·开发语言·后端·spring·基础·javase
扶风ff1 小时前
练题簿在线免费刷题:会员线下组卷、Word 试卷与成绩导入,课堂检测更方便
java·开发语言·算法·小程序·word
鱼宵1 小时前
Spring AI 可观测与透明化:traceId 串起全链路,思考过程实时直播给用户
java·人工智能·spring·链路追踪·springai
天天被压力1 小时前
【别再到处找免费股票数据API了:官方204个接口,32篇一次讲透 #25】北交所财务技术指标难搞?12个接口,报表+MACD全拿
java·人工智能·python
Raas1001 小时前
AI网关能做语义缓存吗?MAI Gateway(魔芋企业级AI网关)实战能力深度解读
java·后端·spring
天空鸟_时光不老1 小时前
13-亮点提炼:把技术说辞翻译成业务价值
java·spring boot·spring·spring cloud·mybatis