SpringBoot异步请求时获取ServletRequestAttributes为空,request空指针问题

本文介绍了在Spring使用@Async注解进行异步请求时遇到RequestAttributes为空的问题,以及两种解决办法。方法一是尝试通过RequestContextHolder在子线程中共享RequestAttributes,但该方法在服务器环境下失效。方法二是利用ThreadLocal存储参数,成功解决了问题。提供了一个ThreadLocalUtil工具类的示例代码。

项目使用@Async注解进行异步请求,获取RequestAttributes为空,后续操作中从request获取参数报错,后查询资料解决;

 方法一:异步之前开启子线程共享

设置值:

ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); 
sra.setAttribute("key","value",1);//设置参数值
RequestContextHolder.setRequestAttributes(sra, true);//设置子线程共享

取值: 

ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if(attributes != null) {
   String value = attributes.getAttribute("key", 1);
}

 结果:本地idea测试通过,部署到服务器后失效,原因未深究,使用了方法二。

 方法二:使用 ThreadLocal传递参数

Threadlocal是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据

 设置值:异步方法传入参数,将参数设置到ThreadLocalUtil中 

@Async
public void testAsyn(String name) {
    ThreadLocalUtil.set("name", name);
    // .......
}

 取值:在异步方法中获取参数

String ThreadLocalUtil.get("name");

结果:解决问题

附带ThreadLocalUtil工具类代码:https://blog.csdn.net/weixin_42260124/article/details/118763029

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值