lyAuditResourcePOList = lyAuditResourceDTOList.parallelStream() .map(LyAuditResourceTransfer::lyAuditResourceDTO2LyAuditResourcePO) .collect(Collectors.toList());

核心原因:parallelStream () 是多线程!

而你的 TokenUtil 用的是 ThreadLocal!

一句话原理

ThreadLocal = 只能在【当前线程】取值parallelStream = 自动开多个新线程

👉 主线程存了 Token👉 子线程(并行流)完全拿不到!👉 所以 TokenUtil.getCurrentUserId() = null


为什么普通 stream () 可以,parallelStream () 不行?

list.stream() // 单线程,和调用方同一个线程 → 能拿到 list.parallelStream() // 多线程,新开线程 → 拿不到!

解决方案(2 选 1,立刻解决)

方案 1:最简单 → 把 parallelStream () 改成 stream ()

99% 业务不需要并行流,直接改单线程流就好

lyAuditResourcePOList = lyAuditResourceDTOList.stream() .map(LyAuditResourceTransfer::lyAuditResourceDTO2LyAuditResourcePO) .collect(Collectors.toList());

✅ 立刻就能拿到 Token!

方案 2:必须用并行流?→ 提前把 Token 取出来传进去

不要在 lyAuditResourceDTO2LyAuditResourcePO 里面取 Token!外面先取,再传进去!

// 1. 主线程先拿到 String userId = TokenUtil.getCurrentUserId(); String userName = TokenUtil.getCurrentUserName(); // 2. 传给转换方法 lyAuditResourcePOList = lyAuditResourceDTOList.parallelStream() .map(dto -> LyAuditResourceTransfer.lyAuditResourceDTO2LyAuditResourcePO(dto, userId, userName)) .collect(Collectors.toList());

✅ 这样多线程也不会丢!

终极总结(你只要记住这句)

只要看到 parallelStream () + ThreadLocal,一定拿不到值!parallelStream 是多线程,ThreadLocal 是线程隔离,天生不兼容!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐