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"