1. 概述
iidp 平台通过 MetaConstant 定义了一系列忽略标记,用于在特定业务场景下跳过框架默认行为(如逻辑删除、校验、审计日志等)。
核心原则:所有忽略标记必须通过 try-finally 确保清理,防止标记泄漏影响后续请求。
2. 标准使用模式
Meta meta = BaseContextHandler.getMeta();
try {
// 1. 添加忽略标记
meta.addArgument(MetaConstant.XXX, true);
// 2. 执行业务操作
} finally {
// 3. 必须清理标记
meta.getArguments().remove(MetaConstant.XXX);
}
3. 忽略标记清单
| 标记常量 | 值 | 作用 | 使用场景 |
|---|---|---|---|
IGNORE_LOGIC_DELETE |
"IgnoreLogicDelete" |
跳过逻辑删除过滤 | 查询/更新已删除数据、数据恢复 |
IGNORE_VALIDATE |
"IgnoreValidate" |
跳过数据校验 | 批量导入、系统初始化 |
IGNORE_OPERATOR_LOG |
"IgnoreOperatorLog" |
跳过操作日志记录 | 高频批量操作、定时任务 |
IGNORE_AUTO_LOG |
"IgnoreAutoLog" |
跳过审计字段自动填充 | 数据迁移、保留原始审计信息 |
IGNORE_SCOPE |
IS_IGNORE_SCOPE |
跳过作用域/数据隔离 | 跨租户查询、管理员操作 |
4. 各标记详细示例
4.1 IGNORE_LOGIC_DELETE - 跳过逻辑删除
场景:查询或更新已被逻辑删除的数据(delete_flag = '1')。
Meta meta = BaseContextHandler.getMeta();
try {
meta.addArgument(MetaConstant.IGNORE_LOGIC_DELETE, true);
TestUser testUser = new TestUser();
// 查询包含已删除的数据
List<TestUser> allUsers = testUser.search(null, null, null, null, null);
} finally {
meta.getArguments().remove(MetaConstant.IGNORE_LOGIC_DELETE);
}
4.2 IGNORE_VALIDATE - 跳过数据校验
场景:批量导入、系统初始化时跳过字段校验。
Meta meta = BaseContextHandler.getMeta();
try {
meta.addArgument(MetaConstant.IGNORE_VALIDATE, true);
TestUser user = new TestUser();
user.setName(""); // 空值,正常触发 @Validate.NotBlank
user.setAge(200); // 超过 @Validate.Max(110)
user.create(); // 不校验,直接插入
} finally {
meta.getArguments().remove(MetaConstant.IGNORE_VALIDATE);
}
4.3 IGNORE_OPERATOR_LOG - 跳过操作日志
场景:高频批量操作、定时任务,避免日志爆炸。
Meta meta = BaseContextHandler.getMeta();
try {
meta.addArgument(MetaConstant.IGNORE_OPERATOR_LOG, true);
TestUser testUser = new TestUser();
// 批量更新 10万条,不记录操作日志
for (List<TestUser> batch : batches) {
testUser.batchUpdate(batch);
}
} finally {
meta.getArguments().remove(MetaConstant.IGNORE_OPERATOR_LOG);
}
4.4 IGNORE_AUTO_LOG - 跳过审计字段
场景:数据迁移、保留原始创建人/时间。
Meta meta = BaseContextHandler.getMeta();
try {
meta.addArgument(MetaConstant.IGNORE_AUTO_LOG, true);
TestUser user = new TestUser();
user.set("create_user", "old_system"); // 保留原始创建人
user.set("create_date", "2020-01-01"); // 保留原始创建时间
user.create(); // 不自动填充审计字段
} finally {
meta.getArguments().remove(MetaConstant.IGNORE_AUTO_LOG);
}
4.5 IGNORE_SCOPE - 跳过作用域/数据隔离
场景:跨租户查询、管理员查看全局数据。
Meta meta = BaseContextHandler.getMeta();
try {
meta.addArgument(MetaConstant.IGNORE_SCOPE, true);
TestUser testUser = new TestUser();
// 查询所有租户的数据
List<TestUser> allTenantUsers = testUser.search(null, null, null, null, null);
} finally {
meta.getArguments().remove(MetaConstant.IGNORE_SCOPE);
}
5. 组合使用示例
场景:数据迁移 - 忽略逻辑删除、校验、审计日志。
Meta meta = BaseContextHandler.getMeta();
try {
// 组合添加多个标记
meta.addArgument(MetaConstant.IGNORE_LOGIC_DELETE, true);
meta.addArgument(MetaConstant.IGNORE_VALIDATE, true);
meta.addArgument(MetaConstant.IGNORE_AUTO_LOG, true);
meta.addArgument(MetaConstant.IGNORE_OPERATOR_LOG, true);
// 执行数据迁移
for (Map<String, Object> row : migrateData) {
TestUser user = new TestUser();
user.setMap(row);
user.create();
}
} finally {
// 必须全部清理
meta.getArguments().remove(MetaConstant.IGNORE_LOGIC_DELETE);
meta.getArguments().remove(MetaConstant.IGNORE_VALIDATE);
meta.getArguments().remove(MetaConstant.IGNORE_AUTO_LOG);
meta.getArguments().remove(MetaConstant.IGNORE_OPERATOR_LOG);
}
6. 注意事项
| 注意点 | 说明 |
|---|---|
| 必须 try-finally | 标记存储在 Meta 上下文中,不清理会影响后续请求 |
| 最小化作用范围 | 尽量缩小 try 块范围,减少标记生效时间 |
| 避免滥用 | 忽略校验/日志会绕过安全机制,需评估风险 |
| 组合使用 | 多个标记同时使用时,finally 中需全部清理 |
7. 完整常量定义
// MetaConstant.java
public final static String IGNORE_SCOPE = IS_IGNORE_SCOPE; // "IsIgnoreScope"
public final static String IGNORE_VALIDATE = "IgnoreValidate"; // "IgnoreValidate"
public final static String IGNORE_LOGIC_DELETE = "IgnoreLogicDelete"; // "IgnoreLogicDelete"
public final static String IGNORE_OPERATOR_LOG = "IgnoreOperatorLog"; // "IgnoreOperatorLog"
public final static String IGNORE_AUTO_LOG = "IgnoreAutoLog"; // "IgnoreAutoLog"