线上与测试环境excel导出列不同

📅 2026/7/2 4:40:21
线上与测试环境excel导出列不同
在用户有查看年龄权限时年龄列有列名但无法展示。线上导出表格为姓名年龄手机号张三13111112323李四14222223434线下导出表格为姓名年龄手机号张三1813111112323李四2014222223434用户无查看年龄权限时正常屏蔽年龄列线上导出表格为姓名手机号张三13111112323李四14222223434线下导出表格为姓名手机号张三13111112323李四14222223434在无权限时正常屏蔽。问题定位代码具体逻辑为先查询500条数据开始写入excel在写入excel的时候预查询下一批需要写入的数据public void export(...) { boolean canViewAge isAuthorizationViewAgeUser(); // 主线程判断 ExcelUtils.exportData(..., userService::queryPage, // 异步线程查询映射 writer - { if (!canViewAge) { // 主线程控制列 writer.includeColumnFieldNames(fieldNamesExcluding(..., age)); } }, 500 ); }根因权限判断与数据脱敏不在同一线程上下文表头列控制使用的是主线程的canViewAge因此保留年龄列数据查询在异步线程执行异步线程无法稳定获取SecurityContext导致异步线程判断该用户无权限将年龄字段置空触发条件导出采用分批异步预查询每批500条主线程先判断权限 canViewAge开始写当前批Excel同时在线程池异步预查询下一批数据修复public void export(...) { canViewAge isAuthorizationViewAgeUser(); exportData( query, writerCustomizer - { if (!canViewAge) { writer.includeColumnFieldNames(fieldNamesExcluding(ExportData.class, age)); } }, (q, pageNum, pageSize) - queryPage(q, pageNum, pageSize, canViewAge), // 显式透传 500 );